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函数。

scanf函数具体解释与缓冲区相关推荐

  1. scanf函数详解与缓冲区

    1.基本信息 函数原型: int scanf( char *format, args, ...); 函数返回值: 读入并赋给args的数据个数,遇到文件结束返回EOF,出错返回0. 函数功能: sca ...

  2. c语言 scanf %e,C语言scanf函数详细解释

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

  3. c语言scanf在%后加.意义,C语言scanf函数详细解释

    while(scanf("%d,%d",&a,&b)!=2)fflush(stdin); c=a+b; printf("%d+%d=%d",a, ...

  4. C语言scanf函数详细解释,[转载]C语言printf和scanf函数详细用法

    Printf和Scan函数的使用方法 一 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息.在编写程序时经常会用到此函数.printf()函数的调用格式为: prin ...

  5. c语言scanf函数计算乘积,C语言Scanf函数

    C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...

  6. c语言scanf可以和putchar,C语言getchar和putchar和scanf函数_缓冲区

    C语言getchar和putchar和scanf函数_缓冲区 1.getchar int getchar ( void ); Get character from stdin Returns the ...

  7. c语言scanf函数隐藏的缓冲区,零基础学C语言 笔记四 Scanf函数清除缓冲区

    Scanf函数清除缓冲区 之前涉及到scanf会先到缓冲区看看是否存在数据,若存在数据,就直接拿缓冲区的数据过来使用,这就涉及到了一个问题,那如果缓冲区的数据不是我想要的呢? 方法一:我们用scanf ...

  8. C语言scanf函数用法详细解释!!!

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

  9. C语言scanf函数用法详细解释!

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

最新文章

  1. android 展开式按钮,Android自定义View实现可展开、会呼吸的按钮
  2. 人工智能进入新的发展阶段
  3. 自定义变量 配置文件_跟我一起学.NetCore之自定义配置源热更新对象绑定
  4. ArcEngine的拓扑分析之ITopologicalOperator
  5. NYOJ 309 BOBSLEDDING(dp)
  6. JIRA介绍- 一个专业优秀的缺陷跟踪管理软件
  7. lxml学习【未完成】
  8. Python 图片与字符串互转
  9. ADO.net中临时表DataTable的简单应用
  10. 51nod 1046 A^B Mod C
  11. 新CentOS配制使用时会遇到的问题,Yum的使用,Yum源切换
  12. linux没有telnet命令
  13. linux gzip、bzip2常用压缩、解压缩指令总结
  14. 【我的OpenGL学习进阶之旅】学习OpenGL ES 3.0 的实战 Awsome Demo (中)
  15. 写完APDL命令流之后,如何运行TXT文件,直接生成k文件
  16. 显存测试软件linux环境_CI/CD 中的自动化测试的概要知识 | Linux 中国
  17. JAVA实现简单限流器(上)
  18. allegro中design size无法修改
  19. 聚点 内部 内点 导集
  20. 2019最新Android常用开源库总结(From:知乎)

热门文章

  1. Java——匿名内部类实现线程的两种方式
  2. thinkphp mysql日志_MySQL的日志基础知识及基本操作学习教程
  3. input 0.1无法相加_你真的知道0.1+0.2为何不等于0.3吗?
  4. 解决QTreeWidget中item无法整行同时显示相同颜色
  5. java 生成log4j_Java log4j配置每天生成一个日志文件 - 永恒ぃ☆心 的日志 - 网易博客...
  6. 命令行进入指定目录_VIM学习笔记 操作目录(Manipulate Directory)
  7. 每日一题:leetcode1006.笨阶乘
  8. C++中引用与指针的区别(详细介绍)
  9. php数据接口api安全,API接口数据安全之授权码sign
  10. django中的admin组件