c中scanf函数用法

初看scanf时,觉得还是蛮简单的,但当深入学习后,才发现里面有很多小细节值得我们去注意。
首先,看看scanf的基本格式:scanf("<格式化字符串>",<地址表>)
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

我们输入的数据大体上可以分为几个类型::

  1. 格式化说明符
  2. 空白符*****(空白符包括 空格,制表符,换行符,回车符和换页符)*****
  3. 非空白符

下面是几个容易忘记的点:

1.sacnf()中的变量必须使用地址。
这是相当基础的点,但当很多新手敲代码的时候总是容易忘记。

2.scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。

就像scanf("%d,%d",&a,&b)
一样,当你输入数据的时候,如输入10和12时,要这样10,12.
记得将非空白字符也要弄过去!!!输入进去!!!
ex:scanf(“a=%d,b=%d”,&a,&b);
输入: a=3,b=4 ↙(“a=”,“b=”,逗号与"%d,%d"中的"a=","b="及逗号对应)

3.scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。

下面介绍一个有用的函数
函数名: fflush
功 能: 清除一个流

一般这样写: fflush(stdin);
拿来清空缓冲区!!

也可以用“空格符”来处理缓冲区残余信息的示例:
!!!!

scanf(" %c",&a);

注意啊,%c前面是有一个空格的,这是来把前面留下的空格吸走的!(嘻嘻)

处理scanf()函数误输入造成程序死锁或出错

#include <stdio.h> 
int main() 
{ 
int a,b,c; /*计算a+b*/
scanf("%d,%d",&a,&b); 
c=a+b; 
printf("%d+%d=%d",a,b,c); 
}

如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输入,一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?
解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。
正确的例程:

#include <stdio.h> 
int main() 
{ 
int a,b,c; /*计算a+b*/
while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);
c=a+b;
printf("%d+%d=%d",a,b,c);
}

难点问题
1.对于scanf中的空白符问题
例子:scanf( "%d/n ",&a);//这里多了一个回车符/n

结果要输入两个数程序才结束,而不是预期的一个。

原因:::

用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括 


空格,制表符,换行符,回车符和换页符。所以如果你用scanf( "%d ",&a)也会出现同样的问题。
注意哈,%d后面是有空格的

反思::
!!!!
敲代码的时候呢,要注意哈,scanf中的不要乱加 空格啊。。。
不然很难解决的1!!!

2.scanf()函数的参数输入类型不匹配问题
对于scanf( "%d%c ",&a,&c),scanf语句执行时,首先试图从缓冲区中读入一个%d类型的数据,如果和 第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参 数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语句。

还要注意另一个问题,如果输入了非法数据,键盘缓 冲区就可能还个有残余信息问题。

总结以上第二点(个人认为的最难点):

如果和 第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参 数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语句。 

重要事情说三遍:哈哈哈:
如果和 第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参 数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语句。

是执行下一个语句哑!

猜你喜欢

转载自blog.csdn.net/qq_43504939/article/details/89035144