您的位置:首页 > 编程语言 > C语言/C++

C语言的输入缓冲区相关问题

2017-07-09 23:34 176 查看
关于scanf()这个函数一个重要的问题就在于他一次性就直接受一个输入值,例如:

#include <stido.h>

#include <iostream>

int main()

{

char a,ch;

scanf("%c”,&a);

scanf("%c”,&ch);

printf("hello world\n");

  system(“pause");

return 0;

}

当输入这些代码的时候,原本是

w

R

hello world

但是实际的方针提示

w

hello world

这是因为scanf()这个函数只接受输入的第一个字符,当我们仿真的时候enter按键,也就相当于一个"\n"的字符,所以“\n"作为一个字符输入给了 ch 这个字符变量。

当我们一次性输入很多字母的时候,scanf()只接收第一个字符,其余的字符储备在了缓冲区,等到再次调用是scanf()函数时候,缓冲区储存区域的第一个字符就会自动的进入到此次调用的scnaf()函数,为了避免发生这种现象我们可以利用如下的方法:

#include <stdio.h>

#include<iostream>

int main()

{
char ch,a;

scanf("%c",&ch);

setbuf(stdin,NULL);

scanf("%c",&a);

printf("hello world);

  system("pause");

return 0;

}

使用 setbuf(stdin,NULL);这个函数将输入缓冲区进行清空,这样字,scanf()输入完东西,缓冲区的数据都会被清除掉;

但是,这种方法有一个缺点就是,标准的C与C++里面从来没有定义锅这个函数,所以fflush(stdin)可能某些机子上运行不了。

补充,有时候我们输入的并不是正确的值,但是缓冲区回残留一些信息,下一个scanf可能直接读取上一个是残废()中剩余的值,这时候就会导致程序出故障,但是我们可以利用scanf()函数特性

特性:

scanf()的返回值就是他成功读取的值,比如

scanf("%c,%c",&a.&b)若a.b成功读取a.b的值那么scanf()函数的返回值就是2

还有一种方法:

while(scanf("%c,%c",&a.&b)!=2)

fflush(stdin);

c=a+b;

这样就能保证在输入错误的情况下,能够对缓存区的信息清空;

但是fflush(stdin)并不是标准C中所定义的函数,这个函数在gcc编译环境似乎不能使用,但是下面这种方法便具有普遍性了:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: