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. C语言scanf函数详细解释

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

  2. C语言scanf函数详细解释(转载)

    原文地址:https://blog.csdn.net/21aspnet/article/details/174326 scanf 函数名: scanf 功 能: 执行格式化输入 用 法: int sc ...

  3. scanf函数读取缓冲区数据的问题

    标准I\O的缓冲类型 标准I\O根据不同的应用需求,提供了全缓冲.行缓冲.无缓冲三种缓冲方式. 全缓冲:只有当划定的缓冲区被填满或者数据读取至末尾时,才开始执行I\O操作(执行系统提供的read\wr ...

  4. scanf函数与输入缓冲区

    本文链接:http://www.cnblogs.com/xxNote/p/4008668.html 今天看书的时候遇到scanf函数与缓冲区的问题,产生了一些猜想即:应该有一个指针来记录缓冲区中读取到 ...

  5. scanf()函数释疑(word找的,没源地址了)

    scanf()函数释疑(上) 一.序言 scanf()函数的控制串的使用 例1. #include "stdio.h" int main(void) { int a,b,c; sc ...

  6. Scanf函数输入字符串

    Scanf函数输入字符串 #define _CRT_SECURE_NO_WARNINGS //#pragma warning(disable:4996) #include <stdio.h> ...

  7. [转载]VS2012编译C语言scanf函数error的解决方法

    在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...

  8. scanf()函数用法小结

    scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息. 其调用格式为:      scanf("<格式化字符串>",<地址表>); ...

  9. c语言学习之基础知识点介绍(三):scanf函数

    本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...

随机推荐

  1. [DB2]Linux下安装db2 v9.7

    https://www.cnblogs.com/cancer-sun/p/5168728.html

  2. [BZOJ2553][BeiJing2011]禁忌 dp+AC自动机+矩阵快速幂

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1206  Solved ...

  3. Python2.5/2.6实用教程:基础篇(转)

    介绍 本文方便有经验的程序员进入Python世界.本文适用于python2.5/2.6版本. Deparecated:Python3 和 python2.x语法不同.如果你正在用python3,请参考 ...

  4. Centos6.5安装mysql5.7详解

    最近在linux上面安装mysql5.7上真是遇到了很多坑,真是让人头疼,在这里跟大家简单分享一下流程跟注意的地方. 1.查看linux版本是6.5 cat /etc/redhat-release 2 ...

  5. LoadRunner系列之---web_set_sockets_options,解决No buffer space available错误

    1. 如果在系统运行过程中出现"No buffer space available"或者出现大量连接出现wait的时候, 如何解决? 解决办法: 保证迭代结束后关闭所有的链接: 在 ...

  6. Android的日志工具Log

    Android中的日志工具类是Log(android.util.Log),这个类提供了以下几个方法来供我们打印日志. ♦ Log.v():这个方法用于打印那些最为琐碎的,意义最小的日志信息.对应级别v ...

  7. [CF480E]Parking Lot

    题意:给一个$n\times m$的网格,初始时有些地方不能选,给$k$个询问$(x,y)$,每次令$(x,y)$不能选,然后询问最大子正方形的边长 如果按原题来做,禁止选一个点对答案的影响是极其鬼畜 ...

  8. 【强联通分量缩点】【最长路】【spfa】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的讲学计划

    10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n<=20的数据,暴力搜出所有的可能路径. 结合以上可以得到30分. 60分算法:分析题意可得使者会带着去的城市也就是这个城市所在强 ...

  9. Mac sublime 编译Python UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-8: ordinal not in range(128)

    刚学Python,想打印个“hello 张林峰”,代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- print('hello 张林峰') 用su ...

  10. log4j.properties配置详解与实例-全部测试通过

    最近使用log4j写log时候发现网上的写的都是千篇一律,写的好的嘛不全,写的全一点的嘛没有一点格式,看着累.这里把网上收集到的整理了一下,并且全部都在机器上测试成功了.这么好的文档估计没有了吧? # ...