一、三点说明

1、用户输入的字符,会以ASCII码形式存储在键盘缓冲区;
2、每调用一次scanf函数,就从键盘缓冲区读走一个字符,相当于清除缓冲区;
3、若用户一次输入n个字符,则前n次调用scanf函数都不需要用户再次输入,直到把缓冲区的数据全部读取(清除)干净

4、调用scanf()函数时,用户最后输入的回车也会储存在键盘缓冲区;(见程序示例2)

二、程序示例1

 # include <stdio.h>

 int main()
{
char ch;
while ()
{
scanf("%c", &ch); switch(ch)
{
case '':
printf("haha\n");
break;
case '':
printf("cccccc\n");
// fflush(stdin); //清除缓冲区
break;
case '':
printf("555\n");
break;
case 'e':
return ;
default:
return ;
}
} return ;
} /*
程序在VC++6.0中的显示结果是:
1235r
haha
cccccc

程序示例2

 # include <stdio.h>

 int main()
{
char c;
scanf("%c", &c);
printf("%d\n", c); scanf("%c", &c);
printf("%d\n", c); return ;
} /*
程序在VC++6.0中的显示结果是:
1
49
10
*/

上例中因为1对应的ASCII码是49,回车键对应的ASCII码是10,故有以上输出;

第二个scanf从缓冲区读入了“回车”,显然这是我们不愿要的,如果要想清除这个垃圾值,只需要在第8行添加语句fflush(stdin)

程序示例3

 #include <stdio.h>
#include <conio.h> void main( void )
{
int integer;
char string[]; /* Read each word as a string. */
printf( "Enter a sentence of four words with scanf: " );
for( integer = ; integer < ; integer++ )
{
scanf( "%s", string );
printf( "%s\n", string );
} /* You must flush the input buffer before using gets. */
fflush( stdin );
printf( "Enter the same sentence with gets: " );
gets( string );
printf( "%s\n", string );
}

三、清除缓冲区的几种方法

我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种问题,需要通过各种方法将输入缓冲区的内容读出来(清除)

1、fflush(stdin)

在程序17行如果插入代码,依然输入1235r,则输出为 haha  cccccc

此种方法对vc可以,但对xcode和linux不适用

2、while+getchar

while (ch=getchar() != '\n' && ch != 'EOF'),直到读取到缓冲区的换行或者空值

四、关于scanf函数接受键盘的细节

程序示例1

 #include <stdio.h>

 int main()
{
int a = , b =;
char d = 'a', e ='a';
scanf("%d",&a); //输入字符a到缓存,跳过接受,a=0
scanf("%d",&b); //输入字符a到缓存,跳过接受,b=0
scanf("%c",&d); //输入字符a到缓存,接受,d=a
scanf("%c",&e); //e接受换行符,ASCII为10
printf("%d,%d,%c,%d\n",a,b,d,e);
return ;
} /*
程序在VC++6.0中的显示结果是:
a
0,0,a,10
*/

scanf()函数原理的更多相关文章

  1. scanf()函数的原理

    最近使用scanf发现了自己对scanf函数还是不太了解,主要出现在无意中出现的一个错误: scanf正确的写法是,scanf中以什么格式输入变量,则变量的类型就应该是什么格式,如下面scanf输入到 ...

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

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

  3. C语言之可变参实现scanf函数

    既然有printf函数可变参实现,那就一定有scanf函数的可变参实现.废话不多说,源码奉上: 本源码不过多分析,如要明白原理,请翻本博客以往的文章看说明. 欢迎关注新浪微博:http://weibo ...

  4. scanf函数的返回值

    #include <stdio.h> int main() { ]; ]); printf("%d\n", n); ; } 此刻注意scanf函数里面的格式限定,该代码 ...

  5. C语言中scanf函数的实现

    接上一篇C语言中可变参数函数实现原理,从理论上详细介绍了C语言中可变参数函数的实现,这一篇从minix内核源码中的scanf函数入手,学习C语言经典可变参数函数的实现过程 在scanf.c文件中,可以 ...

  6. 4-printf & scanf函数

    一.printf函数 这是(printf和scanf)在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h> 1.用法 1> printf(字符串) ...

  7. C语言scanf函数详细解释

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

  8. 黑马程序员-scanf函数

    变量的内存:字节和地址:1.变量的存储单位是字节,每个字节都有存储地址.2.不同的数据大小占用的内存带下不同拥有的字节数也是不同的.变量的存储:1.存储是按照,先存储的放在地址教高的位置,优先存储的地 ...

  9. C语言Scanf函数

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

随机推荐

  1. TCP/IP笔记——UDP

    OSI模型中最下面的两层用来解决两个硬件设备在物理上的通信问题(如规定怎么将电平信号转换为数字信号),相对应的TCP/IP模型中,这部分代表将会将机器封装为一个MAC地址来实现通讯.网络层是关于,具体 ...

  2. java正则匹配正则表达式

    1.简单匹配小案例 public static void main( String[] args ){ // 按指定模式在字符串查找 String line = "This order wa ...

  3. Sql注入校验

    /// <summary> /// Sql注入校验 /// </summary> /// <param name="listWord">字符&l ...

  4. Eclipse连接SQL Server 2008数据库

    一.准备材料 要能够使用数据库就要有相应的JDBC,所以我们要去Microsoft官网下载 https://www.microsoft.com/zh-cn/download/details.aspx? ...

  5. Vue 2.0 入门系列(15)学习 Vue.js 需要掌握的 es6 (2)

    类与模块 类 es6 之前,通常使用构造函数来创建对象 // 构造函数 User function User(username, email) { this.username = username; ...

  6. [2019上海网络赛F题]Rhyme scheme

    题目链接 题意,求出合法的长度为n的字典序第k小字符串,合法的定义为除了最后一位,每一位的取值范围为'A'到'A'+pos-1,而最后一位的取值范围'A'到当前字符串最大值+1. 队友tql,Orz ...

  7. HNUSTOJ-1258 Time

    1258: Time 时间限制: 1 Sec  内存限制: 128 MB提交: 16  解决: 11[提交][状态][讨论版] 题目描述 Digital clock use 4 digits to e ...

  8. Java的同名属性、同名普通函数、同名静态函数,是否被覆盖

    作者按:虚拟函数的概念早就滚瓜烂熟了.但是今天面试发现:1.同名属性,2.同名普通函数,3.同名静态函数,是否被覆盖的问题.请看下面三个例子: 例子1:测试父类的属性是否存在和被完全覆盖class A ...

  9. 前端开发-css基础入门

    CSS  cascading(层叠) style(样式) sheet(表) css注释 /* 注释内容 */ 快捷键:ctrl ? 引入方式 <!-- 1.行间样式 --> <div ...

  10. java中数组的数组问题

    int[] arr = new int[10]; int[] arr2 = arr; arr[1] = 10; arr2[1] = 20; System.out.println(arr[1]); 上面 ...