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编译环境似乎不能使用,但是下面这种方法便具有普遍性了:
#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编译环境似乎不能使用,但是下面这种方法便具有普遍性了:
相关文章推荐
- gcc c语言中scanf输入格式不正确,清空缓冲区问题
- c字符输入相关问题(缓冲区)
- 深入理解C语言----标准I/O小结(缓冲区,I/O函数及其他相关问题)
- C语言输入缓冲区问题
- 关于C语言使用输入函数后键盘缓冲区还有多余字符没的问题
- C语言scanf函数输入时键盘缓冲区\n的问题
- C语言scanf函数输入时键盘缓冲区\n的问题[经典问题]
- C语言scanf函数输入时键盘缓冲区\n的问题[经典问题]
- C语言 指针相关问题--调用函数实现空间动态申请
- 一个关于C语言输入的问题
- 一个关于C语言输入的问题
- Linux下getchar()输入缓冲区stdin问题分析与处理
- 【C语言】malloc()和free()函数的讲解以及相关内存泄漏问题
- 关于C语言中输入字符的问题
- scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
- C语言字符输入问题
- C语言文件读写操作中缓冲区问题和setbuf函数详解
- 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结
- C语言清空输入缓冲区的N种方法对比
- C语言清空输入缓冲区的N种方法对比