学习C语言两个月后的收获(篇目二) #超详细的scanf() 讲解-->基本用法、scanf() 的返回值 、占位符、赋值忽略符

目录

一. scanf

1.基本用法:

2.参数

3.scanf() 的返回值 

4.占位符: (占位符与printf() 相似)

5.赋值忽略符 


前言

路漫漫其修远兮,吾将上下而求索;


一. scanf

1.基本用法:

scanf() 读取用户的键盘输入  ----> 程序在运行到这个语句的时候,会停下来,等待用户从键盘输入。当用户输入数据之后按下回车,scanf() 就会处理用户的输入,将其存入变量。  scanf() 是库函数 ,其头文件是 <stdio.h>     

 (注:标准输入一般是键盘;标准输出一般是电脑屏幕)

   原理用户输入的数据会先放入缓存(内存区域),等按下回车键之后,按照占位符对缓存进行解读 。解读用户数据时,会从上一次遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符开始。如下面代码:

上述代码,scanf() 读取用户输入时,%d 表示整型,所以 %d 占位符读到 123 便停止了,因为后面的 . 并不属于整数的有效类型。当第二次调用scanf() 时,缓存中还剩下 .456s ,%f 是浮点型,只读 0.456 ,到s 便会停止,因为 s 不属于浮点型的有效字符。

                                                     

2.参数

scanf() 的第一个参数格式字符串 ,里面会放置占位符,用来告诉计算机用户输入的数据类型,其后计算机才能处理这些数据(与printf() 的占位符相似)

可以同时输入多个数据,但是输入时的格式要与格式字符串中的格式保持一致。

 请看下面代码:当数据连在一起的时候,计算机分辨不出这是一个数据还是多个数据,即使在格式字符串中"%d%d%d %d",但是数据之间要用空格(空白字符隔开)

空白字符隔开数据,计算机才知道数据是单独的

或者在知道单个数据数据的位数时(eg.个位)可以限制占位符的宽度

 只有scanf() 在处理非%c 类型的数据时,会主动跳过、过滤掉空白字符包括空格、制表符、换行符(即使按回车键将输入分为了几行,也不影响解读)等。

-->所以这也就是scanf() 不会读全带有空白字符的字符串的原因

除非搞多个scanf() 来读取

由上,我们可以得到 %s 的规则 从当前第一个空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)才停止 --->  %s 不包含空格,就不适合读取带有空格的字符串。

scanf() 传递的不是值,而是地址,所以要在变量面前加上&,但如果变量本身就是指针,就不用加&。

int arr[]={1,2,3,4};
scanf("%d",arr); //数组名是该数组首元素的地址,为指针,故而不加&

TIps: 指针变量里面存放的是地址,表示指向这个存地址的数值。

3.scanf() 的返回值 

 <其返回值是整数,代表成功读取的变量个数>

  • 当没有读取任何项,匹配失败   --> 返回0
  • 若在成功读取数据前发生了读取错误或者读取到文件结尾   --> 返回常量EOF(-1)
  • 正确读取  --> 返回成功读取的变量个数(整数)

注:EOF是文件结束的标志(end of file)

简单来说就是,只要没有返回 -1 ,都表示scanf() 读取没有错误。若是scanf() 返回 0 则表示未读到任何项,若是返回整数,则代表了scanf() 成功读取的个数。

4.占位符: (占位符与printf() 相似)

%d  :整型

%s  :字符串

%f   : float 类型浮点数

%lf  : double 类型附浮点数

%Lf  : long double 类型浮点数

%[ ]  : 在方括号中指定一组匹配的字符(比如:%[0-9] ),遇到不在集合内中的字符,匹配会停止

%c  : 字符。只要是字符,都会去读取(包括空白字符)

除了 %c ,其他的占位符都会自动忽略起首的空白字符。但是如果想要让%c 强制跳过起首的空白字符,就在 %c 前面添加一个空格,以表示跳过起首的零个或多个空白字符.

char ch = '0';
scanf(" %c", &ch )://若输入为 "      s"
printf("%c\n", ch ); //输出为 's'

注:为什么这里对 char 类型初始化用的是 ‘0’ ?因为字符本质上就是ASCII码值。

5.赋值忽略符 *

当要用户输入一个数据,然而这个数据的格式有多种表现形式,只想让scanf() 读取主要数据,而忽略格式,该怎么做?(eg.输入日期 年-月-日 or 年/月/日 or 年.月.日 等多种格式)

‘ * ’ ------>  赋值忽略符

%*c  ;在 占位符的% 后面添加一个 赋值忽略符 * ,表示 这个占位符没有对应的变量,解读后不必返回。

简单来说就是这个占位符不会有返回值,解析后就被丢弃了。

<think>嗯,用户问的是C语言scanf函数返回-1和0分别代表什么。首先我需要回忆一下scanf函数的返回值定义。scanf返回值通常是成功读取的输入项的数量。如果输入失败或者在匹配第一个项之前就遇到了文件结束或错误,它会返回EOF,也就是-1。而返回0的情况应该是在没有任何输入项被成功读取的情况下发生的,比如当输入的格式与指定的格式不匹配时。 接下来需要详细解释每个返回值的具体情况。比如,当用户输入的数据类型与格式字串中的不匹配,比如期望整数但输入了字母,这时scanf无法解析,会导致返回0。而返回-1的情况通常是在输入流结束的时候,比如在Unix/Linux系统中按Ctrl+D或者在Windows中按Ctrl+Z,导致输入结束,此时scanf返回EOF,也就是-1。 可能还需要举个例子来说明不同情况下的返回值。比如,当使用scanf("%d %d", &a, &b);时,如果用户输入了一个整数然后一个字母,那么第一个%d会被成功读取,第个会失败,此时返回1,但如果是输入字母开头,则返回0。而如果输入流提前结束,比如在没有任何输入的情况下到达文件末尾,则返回-1。 然后要确保回答正确,没有混淆scanf和fscanf的区别,它们的行为类似,但scanf是从标准输入读取。同时,需要提醒用户注意处理返回值,以避免潜在的错误,比如未初始化的变量。 最后,按照用户的要求,生成相关的后续问题。这些问题应该围绕scanf的不同返回情况、EOF的含义、处理错误输入的方法,以及相关的输入函数如fscanf的区别展开。</think><< `scanf` 的返回值表示成功读取并匹配的输入项的数量。具体说明如下: 1. **返回 `-1`(即 `EOF`)**: 当输入流遇到文件结束(End-of-File,如 `Ctrl+D`(Linux/Mac)或 `Ctrl+Z`(Windows))或发生输入错误时,`scanf` 返回 `EOF`(通常定义为 `-1`)。 2. **返回 `0`**: 当输入数据与格式字串的预期类型不匹配,且没有成功读取任何项时,返回 `0`。 示例代码: ```cpp #include <stdio.h> int main() { int a; printf("输入一个整数:"); int result = scanf("%d", &a); if (result == EOF) { printf("输入已终止或发生错误\n"); } else if (result == 0) { printf("输入类型不匹配\n"); } else { printf("成功读取:%d\n", a); } return 0; } ``` **解释**: - 若用户输入非数字(如 `abc`),`scanf` 返回 `0`。 - 若用户主动终止输入(如按下文件结束),`scanf` 返回 `-1`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值