1.基本信息

函数原型

int scanf( char *format, args, ...);

函数返回值

读入并赋给args的数据个数,遇到文件结束返回EOF,出错返回0。

函数功能

scanf函数是格式化输入函数,它从标准输入设备(键盘)读取输入的信息。按format指定的格式输入数据给args所指向的内存单元。

调用格式

scanf("格式控制字符串",地址表);

int a, b;
scanf("%d%d",&a,&b);//输入10 12

其中格式控制串由三类字符构成:格式化说明符、空白符、非空白符

1 格式化说明符

%c    读入一个字符

%d    读入十进制整数

%f     读入一个浮点数

%o    读入一个八进制整数

%x     读入十六进制整数

%s    读入一个字符串

%p    读入一个指针

%[]    扫描字符集合,输入的字符属于方括号内字符串中某个字符,则提取该字符,否则结束提取

%[^]   扫描字符集合,输入的字符属于属于方括号内字符串中的某个字符,结束提取

2 空白字符

空白字符会使scanf()函数在读取操作时略去输入中的一个或多个空白字符,空白字符可以是space,tab,newline,直到第一个非空白字符出现为止。之所以被称为空白字符是因为它们被打印出来时,在页面上出现的是空白而不是各种记号。

3 非空白字符

非空白字符会使scanf()函数在读取时剔除与之相同的非空白字符。

2. scanf函数的注意事项

1. scanf函数中"格式控制"的后面应该是变量地址。

2. 如果在“格式控制”字符串中除了格式说明符还有其它字符,则在输入数据时在对应的位置输入与之相同的字符。

3. 在用“%c”格式输入字符时,空白字符(space,tab,newline)和“转义字符”都作为有效字符输入。

4. 在用“%s”格式输入字符时,输入的字符串中含有空白字符(space,tab,newline),字符串读取结束。

5. 在输入数据时,遇到以下情况时认为该数据结束。

(1) 遇到space,newline,Tab键;

(2) 按指定的宽度输入;

(3) 遇到非法输入;

3 清除键盘缓冲区

键盘缓冲区,是计算机输入过程重要环节。它是一个环形队列,用来临时保存从键盘输入的字符,共32字节。

补充说明:

‘Enter回车键’包含1个字符是‘\r’’;

方法1:

int c;
while ( ( c = getchar() ) != '\n' && c!= EOF)
{;
}

不停的使用getchar()获取缓冲区字符,直到获取的字符是换行符'\n'或文件结尾EOF为止,这个方法可以完美清除输入缓冲区,并且具备可移植性。

方法2:

fflush( stdin );

刷新标准输入缓冲区,也就是丢弃缓冲区中的内容。(非标准)

4  错误案例分析

4.1 参数输入不匹配

 int data = -1;while (1){printf("1:\n2:\n3:\n4:\n0:\ninput sever:");scanf("%d",&data);//输入不是整数data值不改变switch (data){case 1:  printf("1\n");break;case 2:  printf("2\n");break;case 3:  printf("4\n");break;case 0:  break;default: printf("default\n");}if (data == 0){break;}}//end of while

问题:

当不小心输入了一个字符,而不是数据时。程序进入死循环,不断输入printf函数的内容。

分析:

由于scanf("%d",&data)要求参数是个整数,而实际输入却为字符,参数不匹配scanf结束data的输入。函数继续执行。当再次执行到scanf函数时,此时输入缓冲区中有内容,直接从缓存中读取不再等待人为输入。故出现死循环,屏幕不再有等待输入提示。

办法:

在scanf函数后添加fflush(stdin)就可以解决问题了。因为每次输入数据时缓冲区都被刷新,每次都会等待输入。

4.2 scanf输入中不能有空格的问题

 char str[80];scanf("%s",str);printf("str = %s\n", str);

问题:

当输入的字符中有空格时,输出不完整。

分析:

%s格式字符遇到空格时结束读取,后续的字符不再读取储存。

办法1:

scanf函数改写为:scanf("%[^'\n']",str);

办法2:

使用gets函数,关于gets函数见:gets()函数详解与缺陷

4.3 %c和缓冲区问题

char str[5];for(int i = 0; i < 4; i++)
{scanf( "%c",&str[i]);
}str[4] = '\0';
printf("str:%s\n",str); 

问题:

当输入a回车b回车,函数执行结束;

分析:

由于scanf按%c格式输入,当输入a并按回车时输入缓冲区中的内容是'a'和'\r',分别给了str[0]和str[1]。同样输入b时也是如此。刚好4个字符结束输入。str字符数组的内容分别是'a'、'\r'、'b'、'\r'、'\0'。

办法1:

在scanf函数后面添加语句:fflush(stdin);

办法2:

使用gets函数。

转载于:https://www.cnblogs.com/jinxiang1224/p/8468441.html

scanf函数详解与缓冲区相关推荐

  1. [C语言] scanf 函数详解多组输入法和gitee 自荐

    自荐 gitee>>> C语言学习练习: C语言学习练习 上面是我的gitee C语言仓库链接,欢迎大家来看看我写的代码.!(◦˘ ³(♡ŐωŐ♡)(给大家推荐gitee(码云)这个 ...

  2. C语言scanf函数详解

    函数名: scanf  功 能: 运行格式化输入  用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...

  3. scanf函数详解(下)

    问题一 如何让scanf()函数正确接受有空格的字符串?如: I love you! #include <stdio.h> int main() { char str[80]; scanf ...

  4. scanf()函数详解

    scanf()函数是所有C语言学习者在学习C语言过程中所遇到的第二个函数(第一个函数是printf(),Brian W.Kerninghan & Dennis M.Ritchie的" ...

  5. 【C语言】scanf函数详解(常见问题处理)

    目录 一.scanf函数介绍 二.空白字符和非空白字符 三.scanf函数使用注意事项 四.scanf函数使用常见问题 一.scanf函数介绍 scanf()是C语言中的一个输入函数.与printf函 ...

  6. scanf 接收 空格 输入_【C语言】- printf 和scanf 函数详解!

    一.printf函数 这是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据. 1.用法 1> p ...

  7. C语言scanf函数详解和示例

    文章目录 一.数据输入 二.断章取义 三.scanf输入 1.输入整数 2.输入字符 3.输入浮点数 4.输入字符串 5.输入多个内容 6.示例(book13.c) 四.注意事项 五.获取视频教程 六 ...

  8. C语言中scanf函数详解

    scanf函数   上一节中我们讨论了,如何将整数,浮点数,字符串打印到屏幕上去.既然有输出,怎么能没有输入呢?这一节中,我们来介绍与printf相反的scanf函数.   scanf的功能是将键盘输 ...

  9. c--scanf()函数详解

    一:scanf()函数的影响 scanf()函数是所有C语言学习者在学习C语言过程中所遇到的第二个函数(第一个函数是printf(),Brian W.Kerninghan & Dennis M ...

最新文章

  1. 散列表查找(哈希表)
  2. spark shuffle内在原理说明
  3. android mapbox 添加多个点,使用Android Mapbox SDK显示多个标记的自定义infoWindow
  4. hdu2973 YAPTCHA
  5. 《JavaScript入门经典(第4版)》上第5章一个实例程序的修正,完善
  6. 机器学习-朴素贝叶斯分类
  7. AOS编排语言系列教程(五):创建安全组SecurityGroup
  8. 四张图,读懂 BIO、NIO、AIO、多路复用 IO 的区别
  9. Springboot在线电影系统实战开发
  10. shell 除法 小数点
  11. ElasticSearch 集群监控
  12. AcWing 902. 最短编辑距离(线性DP)
  13. 无线性能优化:FPS 测试
  14. 两种方法,给你的Safari浏览器添加必应/有道/谷歌网页即时翻译插件
  15. Python绘图 好用的网址
  16. 科技软文营销标题写作的5个常用技巧
  17. X1000对于camera控制部分的翻译
  18. 数据基础-索引和完整性(约束)
  19. 假如我来架构12306网站(一) - 概论
  20. 智能PID软件-AVEVA Diagrams报表功能介绍【图瓦软件出品】

热门文章

  1. 推荐一款 最方便的 阅读blog的软件---SharpReader!
  2. 线程或进程绑定到特定的cpu
  3. redis集群之主从架构
  4. makefile 文件模板
  5. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介...
  6. AngularJS学习笔记(二) 表单验证案例(ng-repeat/filter)
  7. HDU 1253 胜利大逃亡
  8. c++还有一个小时考试
  9. Ipad亚麻布纹背景-最终效果_学习教程
  10. 下载Android源码流程(完整版)