scanf()函数原理
一、三点说明
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()函数原理的更多相关文章
- scanf()函数的原理
最近使用scanf发现了自己对scanf函数还是不太了解,主要出现在无意中出现的一个错误: scanf正确的写法是,scanf中以什么格式输入变量,则变量的类型就应该是什么格式,如下面scanf输入到 ...
- c语言学习之基础知识点介绍(三):scanf函数
本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...
- C语言之可变参实现scanf函数
既然有printf函数可变参实现,那就一定有scanf函数的可变参实现.废话不多说,源码奉上: 本源码不过多分析,如要明白原理,请翻本博客以往的文章看说明. 欢迎关注新浪微博:http://weibo ...
- scanf函数的返回值
#include <stdio.h> int main() { ]; ]); printf("%d\n", n); ; } 此刻注意scanf函数里面的格式限定,该代码 ...
- C语言中scanf函数的实现
接上一篇C语言中可变参数函数实现原理,从理论上详细介绍了C语言中可变参数函数的实现,这一篇从minix内核源码中的scanf函数入手,学习C语言经典可变参数函数的实现过程 在scanf.c文件中,可以 ...
- 4-printf & scanf函数
一.printf函数 这是(printf和scanf)在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h> 1.用法 1> printf(字符串) ...
- C语言scanf函数详细解释
原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...
- 黑马程序员-scanf函数
变量的内存:字节和地址:1.变量的存储单位是字节,每个字节都有存储地址.2.不同的数据大小占用的内存带下不同拥有的字节数也是不同的.变量的存储:1.存储是按照,先存储的放在地址教高的位置,优先存储的地 ...
- C语言Scanf函数
C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...
随机推荐
- LeetCode.876-链表的中间节点(Middle of the Linked List)
这是悦乐书的第337次更新,第361篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第206题(顺位题号是876).给定具有头节点的非空单链表,返回链表的中间节点.如果有两 ...
- js 如何定义函数
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- c++ 十进制、十六进制和BCD的相互转换
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; // ...
- [DS+Algo] 004 栈、队列及其代码实现
1. Stack FILO (FirstInLastOut) 的链表结构 在程序编译环境上使用较多 常用操作 push pop peek is_empty size Python 代码示例 class ...
- spark性能调优03-shuffle调优
1.开启map端输出文件的合并机制 1.1 为什么要开启map端输出文件的合并机制 默认情况下,map端的每个task会为reduce端的每个task生成一个输出文件,reduce段的每个task拉取 ...
- django -----原生SQL语句查询与前端数据传递?
view.py中 import MySQL def request_data(request): if request.method == "GET": conn = MySQLd ...
- vmware下使用nat方法联网
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Li_Zefeng/article/det ...
- Views的补充
views的补充 请求头一般与请求内容用/r/n/r/n隔开 请求头包含的内容 request.Meta(...) 一般在下面几种方法里面取不到的东西需要去原生的头里面去取,比如用户的终端类型 req ...
- PHP支付宝手机网站支付功能
1.开通支付宝商家中心里面的手机网站支付 2.再去开放平台-开发者中心-创建移动支付的应用-获取到APPID 3.接着去文档中心下载DEMO 其实demo很简单.如果第一次看的话会存在看不懂的状态. ...
- git的配置设置
git的基本配置 git是一个版本控制工具,既然是工具,那么就可以根据人的个人喜好来进行设置,git也提供了配置,可以根据自己的喜好来对它进行个性化的设计,以让自己舒服的玩. git有三个配置文件 / ...