C语言缓冲区问题
#include <iostream>int main()
{
char c;
c = getchar();
putchar(c);
scanf("%c",&c);//故意输入%d想明白原理
putchar(c);
putchar(c);
//运行后我输入ab,却输出aaa,想知道每一条语句对缓冲区做的操作.
return 0;
} #include <iostream>
int main()
{
char c;
c = getchar();
putchar(c);
scanf("%d",&c);//故意输入%d想明白原理
putchar(c);
putchar(c);
//运行后我输入ab,却输出aaa,想知道每一条语句对缓冲区做的操作.
return 0;
}
输入ab
c = getchar();这一行getchar得到的是字符'a',把字符'a'赋值给变量c
scanf("%d",&c);用%d但是得到的是字符'b',scanf不会把字符'b'赋值给变量c,而是直接以失败返回,也就是说这一行完全没有效果,变量c中的内容依然保持着之前的'a'
接下来的两个putchar又输出了两个a,所以输入ab,输出aaa
#include <iostream>
int main()
{
char c ;
c = getchar() ; // 如果键盘输入 "ab",则 c = 'a'
putchar(c) ; // 屏显字符 'a'
scanf("%c", & c) ; // c = 'b'
putchar(c) ; // 屏显字符 'b'
putchar(c) ; // 屏显字符 'b'
return 0 ;
}
本代码一共有 2 处从键盘读取输入,各读取 1 个字符。当运行至:
c = getchar() ;
时,程序等待键盘输入,用户只有输入字符并按下回车后才会继续到下一条语句。这时,如果用户键入了 "ab" 加回车,那么,在键盘缓冲区中就有了这 3 个字符,getchar() 拿到第 1 个字符 'a',键盘缓冲区内剩余 2 个字符。然后,后面的 scanf() 语句又拿到第 2 个字符 'b'。最后,键盘缓冲区还剩余一个回车符。这就是本程序从键盘缓冲区读取字符的全过程解析,希望我已经讲明白了。 人造人 发表于 2019-11-4 06:41
输入ab
c = getchar();这一行getchar得到的是字符'a',把字符'a'赋值给变量c
scanf("%d",&c);用%d但 ...
#include <iostream>
int main()
{
char c;
c = getchar();
putchar(c);
c = getchar();//只要不输入字符b,a就一直在缓冲区吧?
putchar(c);
putchar(c);
//运行后我输入ab,却输出abb。
return 0;
} 〃忝書γě渎ぐ 发表于 2019-11-4 14:34
输入ab
第6行getchar获取到字符'a'赋值给变量c
第7行输出变量c中存储的字符'a'
第8行getchar获取到字符'b'赋值给变量c,变量c之前保存的是'a',现在用'b'覆盖(替换),也就是现在变量c中存储的是'b'
第9行和第10行输出两次变量c,因为变量c中存储的是'b',所以输出了两次'b'
页:
[1]