本文链接:http://www.cnblogs.com/xxNote/p/4008668.html

今天看书的时候遇到scanf函数与缓冲区的问题,产生了一些猜想即:应该有一个指针来记录缓冲区中读取到了哪个字符。书上说scanf函数在%d、%f、%lf等数值控制字符时会跳过缓冲区中的空格、回车、还有制表符(TAB),若遇到+*等字符则会失败而不再跳过;而scanf函数在%c或%s控制字符时则会取走缓冲区的所有字符。此时产生一个疑问,这里的跳过说的是直接改变前面猜想中的那个指针的值还是仅仅跳过而不改变指针的值下一次读取还从指针指向的位置读取呢?

就写了下面的小程序,用这两个输入测试了一下,程序如下:

#include <stdio.h>

int main(void)
{
int ch[5];
//第一次输入:
// 1++2*3
//第二次输入:
// 1【空格】【空格】2【空格】3
//两次输入将会得到不同的结果,这是因为scanf函数在%d、%f、%lf等数
//值控制字符时会跳过缓冲区中的空格、回车、还有制表符(TAB)
//而scanf函数在%c或%s控制字符时则会取走缓冲区的所有字符,
//由此猜也可以猜想到应该有一个指针来记录缓冲区中读取到了哪个字符 scanf("%d", &ch[0]);
scanf("%d", &ch[1]);
ch[2] = getchar();
ch[3] = getchar();
printf("ch[0]:%0x\n", ch[0]);
printf("ch[1]:%0x\n", ch[1]);
printf("ch[2]:%c\n", ch[2]);
printf("ch[3]:%c\n", ch[3]);
printf("%d ch[4]:%d\n", scanf("%d", &ch[4]), ch[4]);
printf("%d\n", ch[4]);
//当输入是“1【空格】【空格】2【空格】3”的时候,
//由23行和24行的输出结果的差异反映了一个事实即:
//__cdecl调用约定是从右到左将参数依次压入栈中
//23行程序传递ch[4]的时候,ch[4]还没有初始化,而
//本程序是在Debug模式下编译运行的所以打印出的值是:cccccccc
//在10进制下这个数值是-858993460(以后见到这个数值的时候检查一下是否忘记初始化)
//23行执行后ch[4]被赋值为我们输入的值,所以24行输出了我们预料中的值
return 0;
}

两种输入的运行结果分别如下:

1++2*3的运行结果:

1【空格】【空格】2【空格】3的运行结果:

后面的这个输出结果比较有意思,也就是23行和24行的ch[4]的值的输出结果的差异是由于__cdecl调用约定是从右到左将参数依次压入栈中。

scanf函数与输入缓冲区的更多相关文章

  1. scanf()中清除输入缓冲区的几种方法归纳

    应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...

  2. [转][修]C清空输入缓冲区

    为何要清空输入缓存区     读取时输入缓冲区中的内容会被scanf函数逐个取走,正常case下scanf()函数可以根据返回值判断成功取走的数目:但当发生读取异常之后,输入缓冲区中的内容并未被取走, ...

  3. C 清空输入缓冲区,以及fflush(stdin)的使用误区和解决方法

    转载:https://blog.csdn.net/Veniversum/article/details/62048870 对C 语言初学者来说,fflush(stdin)函数被解释为会清空输入缓冲区的 ...

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

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

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

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

  6. C语言scanf函数详解

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

  7. c语言scanf()停止接受输入及scanf("%c",&c)吃掉回车或者空格字符的问题

    scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束).          ① 遇空格."回车& ...

  8. scanf()函数

    Scanf函数攻略: (A)                格式化说明符 格式字符           说明 %d                 读入十进制整数 %u                 ...

  9. scanf函数详解

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

随机推荐

  1. elk系列1之入门安装与基本操作

    preface 我们每天都要查看服务器的日志,一方面是为了开发的同事翻找日志,另一方面是巡检服务器查看日志,而随着服务器数量以及越来越多的业务上线,日志越来越多,人肉运维相当痛苦了,此时,参考现在非常 ...

  2. 初学java注解编程 记录错误及解决办法

    1 :在form表单提交到controller层时 利用hbim的封装的访问数据库 form表单中属性要加上method方法 不然不成功. 2 :在运行eclipse时 有时粘贴个数据或者删除个字段老 ...

  3. js003-基本概念

    js003-基本概念 3.1 语法 3.1.1 区分大小写 ECMAScript中的一切(变量.函数名和操作符)都是区分大小写的,并且不能用关键字作为函数名:如 typeof. 3.1.2 标识符 所 ...

  4. C#中使用代码动态改变配置文件信息

    static void Main(string[] args) { XmlDocument xDoc = new XmlDocument(); xDoc.Load("../../App.co ...

  5. ef6 缓存的问题没有了

    public static void Main(string[] args) { PMTestEntities db = new PMTestEntities(); var users = db.Us ...

  6. k-nearest-neighbor算法

    1. kNN 1.1 基本的kNN模型 kNN(k-nearest neighbor)的思想简单来说就是,要评价一个未知的东西U,只需找k个与U相似的已知的东西,并通过k个已知的,对U进行评价.假如要 ...

  7. ubuntu删除输入法后,循环登陆

    在登陆界面ctrl+alt+F1进入tty界面,登陆账号,然后输入 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 可以参考Ubuntu1 ...

  8. CSS学习笔记——选择器

    选择器 当我们定义一条样式规则时候,这条样式规则会作用于网页当中的某些元素,而我们的规定的这些元素的规则就叫做选择器. 常用的选择器: 1.id选择器 #idname 2.类选择器 .classnam ...

  9. 虚拟机NUMA和内存KSM

    KSM技术可以合并相同的内存页,即使是不同的NUMA节点,如果需要关闭跨NUMA节点的内存合并,设置/sys/kernel/mm/ksm/merge_across_nodes参数为0.或者可以关闭特定 ...

  10. 编译安装chkrootkit出现的问题

    tar xf chkrootkit.tar.gz cd chkrootkit-* make sense的时候出现make: *** [strings-static] Error 1,解决办法:yum ...