关于c语言I/O中scanf()的认识

关于c语言I/O中scanf()的认识

2019-07-10

今天是7月10号,开始着我的c语言的学习道路,今天我认识了c语言I/O流中的scanf()输入和printf()输出两种方式。
scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”
它有两种用法,或者说有两种格式。

  1. scanf(“输入控制符”, 输入参数);功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。
  2. scanf(“输入控制符非输入控制符”, 输入参数);
    这种用法几乎是不用的,也建议你们永远都不要用。但是经常有人问,为什么 printf 中可以有“非输出控制符”,而 scanf 中就不可以有“非输入控制符”。事实上不是不可以有,而是没有必要!(转载)

接着我主要总结scanf()输入中我所遇到的几个问题。

1. 空白符问题
#include<stdio.h>
main()
{
int a;
printf(“input the data”);
scanf("%d",&a);
printf("%d",a);
return 0;
}
我运行这个程序后,在输入的过程中我发现程序要我输入两个数程序才能截至而不是一个数,我纳闷了很久,在网上查找了各种解答后,我才明白了原来是因为用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果用scanf("%d ",&a)也会出现同样的问题。(转载)
其实这种问题主要也是不小心导致的,一旦出现这个错误也很难发现,所以今后细心点应该没有问题的。

2. 回车符占位问题
在这里插入图片描述

在我运行这段程序,输入完第一个scanf()后,直接跳过第二个scanf()直接报出结果并且b的值也是一个很庞大的随机数,然后我进行了测试,在输出总数d的同时也输出a,b的值,发现了a,b的值也是莫名产生了一个随机数,很奇怪。之后我明白了输入c和第一个回车后,c和这个回车符都留在缓冲区中。第一个scanf()读取了c,但是输入缓冲区里面还留有一个,第二个scanf()读取这个。然后输入a和第二个回车,同样的,第三个scanf()读取了a,第四个scanf()读取了第二个回车符。第五个读取了b。所以五个scanf()都执行了,并没有提前结束。只不过有的scanf()读取到了回车符而已。(转载)
解决方法:在结尾处加上一个getchar()即可解决

3. scanf()参数类型不匹配

#include<stdio.h>
int main()
{
int a=123;
char c=‘t’;
printf(“input”);
scanf("%d%c",&a,&c);
scanf("%d%c",&a,&c);
scanf("%d%c",&a,&c);
printf("%d%c",a,c);
return 0;
}
当输入a 回车 后,会直接跳过下面2个scanf语句,直接输出为
123
t
原因:对于scanf("%d%c",&a,&c),scanf语句执行时,其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面 所有的参数,而去执行下一条语句。
解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函 数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问 题。(转载)
*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值