当前位置:   article > 正文

scanf函数详解(保姆级讲解)以及使用时需注意的细节

scanf

目录

一.scanf函数的定义:

二.scanf函数的相关信息 

1.功能:

 2.调用格式:

 3.scanf函数字符控制串:

4.常见格式化说明符:

 5.scanf函数的返回值:

三. 使用scanf函数需要注意的问题(重点)

问题一:如何让scanf()函数正确接受有空格的字符串?如: I love you!

问题二:键盘缓冲区残余信息问题

问题三:如何处理scanf()函数误输入造成程序死锁或出错

四.关于scanf函数的发展:

五.小结:


一.scanf函数的定义:

scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

(下图是来自cplusplus.com中对scanf函数的解释) 

二.scanf函数的相关信息 

1.功能:

        执行格式化输入

 2.调用格式:

        scanf("<格式化字符串>",<地址表>);

 3.scanf函数字符控制串:

        1.格式化说明符

        2.空白字符;

        3.非白色字符,格式化说明符(%)除外;

4.常见格式化说明符:

 5.scanf函数的返回值:

        首先scanf函数返回的是int型的数据,scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。

例子:

scanf("%d %d",&a,&b);

如果a和b都读取成功,则返回2。

如果只有a被成功读入,返回值为1;
如果a读取失败,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。

三. 使用scanf函数需要注意的问题(重点

问题一:如何让scanf()函数正确接受有空格的字符串?如: I love you!

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char str[80];
  5. scanf("%s",str);
  6. printf("%s",str);
  7. return 0;
  8. }

输入:

I love you

输出:

I

上述程序并不能达到预期目的。因为scanf扫描到"I"后面的空格就认为对str的扫描结束(空格没有被扫描),并忽略后面的" love you!"。值得注意的是,我们改动一下上面的程序来验证一下:

  1. #include<stdio.h>
  2. #include<windows.h>
  3. int main(void)
  4. {
  5. char str[80],str1[80],str2[80];
  6. scanf("%s",str);/*此处输入:I love you!*/
  7. printf("%s\n",str);
  8. Sleep(5000);/*这里等待5秒,告诉你程序运行到什么地方*/
  9. /**
  10. *不是sleep(5)
  11. *1,函数名是Sleep不是sleep。
  12. *
  13. 2,Windows API中,unsigned Sleep(unsigned)应该是毫秒ms.
  14. */
  15. scanf("%s",str1);/*这两句无需你再输入,是对stdin流再扫描*/
  16. scanf("%s",str2);/*这两句无需你再输入,是对stdin流再扫描*/
  17. printf("%s\n",str1);
  18. printf("%s\n",str2);
  19. return 0;
  20. }

输入:

I love you!

输出:

  1. I
  2. love
  3. you!

所以结论是:残留的信息 love you是存在于stdin流中,而不是在键盘缓冲区中。那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符,请看下面的程序:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. char str[50];
  5. scanf("%[^\n]",str);/*scanf("%s",string);不能接收空格符*/
  6. printf("%s\n",str);
  7. return 0;
  8. }

通过使用scanf("%[^\n]",str)可以有效解决输入字符串中存在空格的问题。

问题二:键盘缓冲区残余信息问题

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a;
  5. char c;
  6. while(c!='N')
  7. {
  8. scanf("%d",&a);
  9. scanf("%c",&c);
  10. printf("a=%dc=%c\n",a,c);
  11. /*printf("c=%d\n",c);*/
  12. }
  13. return 0;
  14. }

通过对这段代码进行运行后可以发现,scanf("%c",&c)并没有很好地执行给c赋值的操作,对于这个·现象,我们可以启用printf("%d",c)进行排查,运行后可以发现输出的值为10,而10对应的ASCII值正是“\n",也就是ENTER换行符,因此我们可以这样解释:当输入a的值scanf函数读取完毕后将ENTER直接赋给了c。对于处理这种为问题,我们需要对输入缓冲区进行清理,这样才能够实现正确给C进行赋值。

对此我们就可以使用getchar()函数将换行符清理掉。

getcahr();

或者直接使用fflush(stdin)函数对输入缓冲区进行清理

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a;
  5. char c;
  6. while(c!='N')
  7. {
  8. scanf("%d",&a);
  9. fflush(stdin);
  10. scanf("%c",&c);
  11. fflush(stdin);
  12. printf("a=%dc=%c\n",a,c);
  13. }
  14. return 0;
  15. }

问题三:如何处理scanf()函数误输入造成程序死锁或出错

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a,b,c;
  5. scanf("%d,%d",&a,&b);
  6. c=a+b;/*计算a+b*/
  7. printf("%d+%d=%d",a,b,c);
  8. return 0;
  9. }

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

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a,b,c;
  5. while(scanf("%d%d",&a,&b)!=2)
  6. fflush(stdin);
  7. c=a+b;
  8. printf("%d+%d=%d",a,b,c);
  9. return 0;
  10. }

四.关于scanf函数的发展:

使用scanf函数进行输入,必须指定输入的数据的类型和格式,不仅繁琐复杂,而且很容易出错。C++保留scanf只是为了和C兼容,以便过去用C语言写的程序可以在C++的环境下运行。C++的编程人员都愿意使用cin进行输入,很少使用scanf。但是scanf有一个明显的优点,速度比cin函数快。

五.小结:

关于scanf函数的相关介绍与讲解,如果瑕疵与纰漏欢迎各位客官老爷评论区指明点正,小的再次·感激不尽,感谢每一位看到这篇文章的客官。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程挑战者/article/detail/62741
推荐阅读
相关标签
  

闽ICP备14008679号