关于C语言中scanf函数换行符\n的读取问题概论

首先针对于scanf函数能否读取换行\n这个问题

我们需要区分不同情况展开讨论

1.如果我们读取的是数字类型 

单纯根据上述程序内容,我们需要输入一个数字 并且赋值给 整型变量 a,然后输入字符并且赋值给c。(最后一行打错了应该是printf(”%d\n%c\n“,a,c))

我们不妨输入格式为

5

z(就是一个数字5加换行加一个字母c)

这个时候输出的结果就是

前两个5z是我输入的结果,可以看到,虽然我有输入换行符,但是却并没有被第二个 scanf函数读取并且赋值给字符变量c

在scanf函数中,如果输入的%d,那么你的输入换行符 (空格也是)会直接被当作结束符号,作为你结束输入的标志。并且这个标志不会被下一个读取字符函数所读取!

可以看到就算我在首行scanf函数里面输入了换行\n变成while(~scanf("%d\n ",&a))输出的结果仍然不受任何影响。 

2.如果前一个输入函数的格式里面是字符

这个时候情况就不能相提并论了!

 我们输入的格式是 

z

z(就是一个数字5加换行加一个字母c)

但是结果跟上图所示,我们还没来得及输入第二个字符z,程序就输出结果了!

原因是对于 scanf("%c",&d);这种输入格式,他是可以读取换行符的!虽然换行符同样 作为scanf("%c",&d);输入结束的标志, 但是由于换行符本身也是一种字符,所以他会被作为结束第一个scanf标志的同时被第二个scanf读取,最后直接输出结果。

解决这种情况的方法有很多种

(1)我们在一个scanf函数末尾加入一个\N

 这个时候我们的输出格式和内容就达到我们理想的预期了

原因是此时 \N也即是我们输入的换行符被作为一个scanf的读取格式输入了,这样换行符就任然会作为第一个scanf函数的结束标志,而第二个scanf的开始标志是输入的第一个非\n(非换行符)的字符

 至此得到一个非常重要的结论

scanf("%c\n",&c),这种在scanf函数末尾加入\n的形式,会把下一个scanf函数输入开始标志百分百变成非换行符的字符

也就是说我们在输入第二个z之前无论输入多少个换行符,都不会影响输入。

红色的框是我的输入部分,可以看到中间的换行符都不会被识别成第二个输入函数的字符了

(2)在第二个scanf前面加入一个\N

 

 

这两个完全是一模一样的效果,不多赘述,同上。

(3)在第二个scanf前面加入一个getchar();

getchar函数的作用是读取一个字符,当然也包括了换行符,

我们同样以

z

z

作为输入格式,可以得到下图的结果

不同于前两个的是,getchar只能读取一个换行符

所以我输入

z

z(z加换行符加换行符加z)就不能达到预期的效果

输入第二个换行符的时候就输出了

这个时候就要根据你输入的格式里有几个换行符 添加相应数量的getchar了

比如我这边输入两个换行符

我加两个getchar就能达到预期效果了

 

 

 

`scanf` 函数在 C 语言中用于从标准输入(通常是键盘)读取数据。如果 `scanf` 没有完全读取预期的数据,可能是因为以下几个原因: 1. 输入不匹配格式:`scanf` 需要与用户输入的数据格式相匹配。例如,如果你期望一个整数,但用户输入了文本或不符合预期的字符,`scanf` 将停止读取并返回已成功读取的部分。 示例错误:```c int num; scanf("%d", &num); // 如果用户输入 "abc",只会读取前一个 'a',num 为 0 ``` 2. 用户按下回车键后没有输入数字:`scanf` 只会在遇到空格、制表符或换行符时停止读取。如果没有输入符合格式的数据,它不会等待下一行的输入。 3. 边界溢出:如果尝试读取的数据超过了变量的存储范围,`scanf` 通常会停止,并可能造成未定义的行为。 示例错误:```c int veryBigNum[5]; // 只能存4个int scanf("%d %d %d %d %d", veryBigNum); // 用户输入超过数组大小的数据,会导致未读取 ``` 4. 错误终止:如果程序在 `scanf` 执行期间崩溃,剩余的数据可能不会被读取。 为了检查是否所有数据都被正确读取,你可以使用 `%n` 格式化说明符来记录已经读取的字节数,然后与预期值进行比较。例如: ```c #include <stdio.h> int main() { int num, count = 0; scanf("%d%n", &num, &count); if (count == sizeof(int) * CHAR_BIT) { // sizeof(int) * CHAR_BIT 是 int 的位宽 printf("Number read successfully.\n"); } else { printf("Not all data was read: only %d bytes.\n", count); } return 0; } ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值