本文链接: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. LAMP-五分钟搭建个人论坛

    LAMP-五分钟搭建个人论坛 系统版本:CentOS7 1.##安装lamp及依赖软件wget http://repo.mysql.com/mysql-community-release-el7-5. ...

  2. HTML5系列四(特征检测、Modernizr.js的相关介绍)

    Modernizr:一个HTML5特征检测库 Modernizr帮助我们检测浏览器是否实现了某个特征,如果实现了那么开发人员就可以充分利用这个特征做一些工作 Modernizr是自动运行的,无须调用诸 ...

  3. iOS - Runloop个人总结

    调用堆栈: 程序运行之前,自上而下启动 iOS端用的所用系统framework都是动态链接的. dyld:The dynamic link editor 动态链接器

  4. >>> FilterDispatcher <<< is deprecated! Please use the new filters!

    在struts2.3.20下,web.xml中使用 会出现*********************************************************************** ...

  5. loading 加载

    <script type="text/javascript" src="jquery-1.3.2.js"></script> <s ...

  6. C#读写文本文件

    static public string Read(string path) { StreamReader sr = new StreamReader(path,Encoding.Default); ...

  7. IIS------IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法

    链接: http://www.cnblogs.com/mrma/p/3529859.html

  8. linux下VNC的配置及使用

    我们知道在windows里面有远程桌面(著名的有pcanywhere,网络人等)对吧,在linux下我们同样有这个东西,其中最流行的一种就是VNC,其实VNC是一种协议,它的全称是virtual ne ...

  9. C# 文件操作大全

    1.创建文件夹//using System.IO;Directory.CreateDirectory(%%1); 2.创建文件//using System.IO;File.Create(%%1); 3 ...

  10. /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc 的区别(转)

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一个运 ...