积极答复者
关于scanf和printf缓冲的问题

问题
-
一个小程序,其中有以下几句:
char c1,c2;
scanf("%c",&c1);
printf("%c",c1);
scanf("%c",&c2);
printf("%c",c2);
这样,run以后,输入c1以后就不能输入c2,是否是因为c1的内容从缓冲区传到内存以后,缓冲区还会残留换行符?
后来把
scanf("%c",&c2);
printf("%c",c2);改成了:
scanf("%c",&c2);
printf("%s",c2);
却可以,为什么?%s和%c有什么不同?
另外,在:
char c1,c2;
scanf("%c",&c1);
printf("%c",c1);
scanf("%c",&c2);
printf("%c",c2);
这段程序中,run了以后,输入c1时直接敲回车键,会有何结果?似乎又可以输入c2了?
这具体是什么原因?求教
答案
-
一个小程序,其中有以下几句:
char c1,c2;
scanf("%c",&c1);
printf("%c",c1);
scanf("%c",&c2);
printf("%c",c2);
这样,run以后,输入c1以后就不能输入c2,是否是因为c1的内容从缓冲区传到内存以后,缓冲区还会残留换行符?
%s和%c有什么不同?
Hi 任一雄,
欢迎来Microsoft论坛。
根据对你问题的分析,当第一次输入c1后,要用flushall函数清除缓存区,再输入c2。
>>%s和%c有什么不同?
%s 对应的是字符串; %c 对应的是字符;
>>对于要求输入c1后还要输入c2
请把程序改成
char c1,c2;
scanf("%c",&c1);
printf("%c",c1);
_flushall();
scanf("%c",&c2);
printf("%c",c2);以下链接是关于_flushall()的:http://baike.baidu.com/view/656661.htm
如果你还有什么问题,请让我知道。另外,如果你解决了问题,请把有用的回答标记为答案。
谢谢!
Lucy
- 已标记为答案 任一雄 2010年12月8日 11:20
-
Hi 任一雄,
1.如果输入的是"a b” 则 c1='a'; c2=' ';
2.如果输入的是"a" 按回车键 再输入 "b" 则 c1='a'; c2=' ';
3.如果输入的是“ab” 则 c1='a'; c2=' b';
4.如果输入的是“abc” 则 c1='a'; c2=' b';
因为在程序看来回车键(\n)和空格键都是一个字符,所以在情况1,2中把前两个字符分别按顺序赋给了c1,c2;
当使用_flushall() 后就把scanf存在缓冲区的数据全删掉了。再输入的值就可以赋给c2。
有_flushall()的程序的具体变化请看下面:
scanf("%c",&c1); // 输入值 (如输入 'a'+回车键 则把第一个字符赋给c1 c1='a')
printf("%c",c1); // 输出c1 的值 (显示a)
_flushall(); //把缓冲区的值删除 (删除存在缓冲区的 \n)
scanf("%c",&c2);//再次输入值 (如 'd‘ c2=d)
printf("%c",c2); //输出c2的值 (显示d)没有_flushall()的程序变化请看下面:
scanf("%c",&c1); // 输入值 (如输入 'a'+回车键 则把第一个字符赋给c1 c1='a' ;把第二个字符赋给了c2 c2即 回车键的值)
printf("%c",c1); // 输出c1 的值 (显示a)
scanf("%c",&c2);printf("%c",c2); //输出c2的值 (显示c2='
')
如果你还有什么问题,请让我知道。另外,如果你解决了问题,请把有用的回答标记为答案。
谢谢!
Lucy
- 已编辑 lucy-liuModerator 2010年12月8日 9:43
- 已标记为答案 任一雄 2010年12月8日 11:20
-
Hi 任一雄,
1.整个过程其实是 输入设备->内存缓冲区->程序。例如
.当我们输入”abc”时,这时候缓冲区的内容是 “abc”
.用程序的scanf("%c", &c1) 语句,就把a字符保存到变量c1中,这时缓存区的内容为 “bc”,’a’被保存到内存中了。
2.>>而且连用scanf的话,缓冲区中会不断的积累曾输入的字符,那么缓冲区满的时候才会自动清除缓冲区
不是的,按第一点说的,scanf是把字符保存到变量中。键盘输入的内容会不断的积累在缓冲区。缓冲区满了不会自动清除缓冲区。
3.>>每次用scanf,敲回车输入数据,都会把一个换行符送到缓冲区
每次敲回车,都会把一个换行符送到缓冲区,和scanf无关。
如果你还有什么问题,请让我知道。另外,如果你解决了问题,请把有用的回答标记为答案。
谢谢!
Lucy
- 已标记为答案 任一雄 2010年12月8日 11:20
全部回复
-
一个小程序,其中有以下几句:
char c1,c2;
scanf("%c",&c1);
printf("%c",c1);
scanf("%c",&c2);
printf("%c",c2);
这样,run以后,输入c1以后就不能输入c2,是否是因为c1的内容从缓冲区传到内存以后,缓冲区还会残留换行符?
%s和%c有什么不同?
Hi 任一雄,
欢迎来Microsoft论坛。
根据对你问题的分析,当第一次输入c1后,要用flushall函数清除缓存区,再输入c2。
>>%s和%c有什么不同?
%s 对应的是字符串; %c 对应的是字符;
>>对于要求输入c1后还要输入c2
请把程序改成
char c1,c2;
scanf("%c",&c1);
printf("%c",c1);
_flushall();
scanf("%c",&c2);
printf("%c",c2);以下链接是关于_flushall()的:http://baike.baidu.com/view/656661.htm
如果你还有什么问题,请让我知道。另外,如果你解决了问题,请把有用的回答标记为答案。
谢谢!
Lucy
- 已标记为答案 任一雄 2010年12月8日 11:20
-
Hi 任一雄,
1.如果输入的是"a b” 则 c1='a'; c2=' ';
2.如果输入的是"a" 按回车键 再输入 "b" 则 c1='a'; c2=' ';
3.如果输入的是“ab” 则 c1='a'; c2=' b';
4.如果输入的是“abc” 则 c1='a'; c2=' b';
因为在程序看来回车键(\n)和空格键都是一个字符,所以在情况1,2中把前两个字符分别按顺序赋给了c1,c2;
当使用_flushall() 后就把scanf存在缓冲区的数据全删掉了。再输入的值就可以赋给c2。
有_flushall()的程序的具体变化请看下面:
scanf("%c",&c1); // 输入值 (如输入 'a'+回车键 则把第一个字符赋给c1 c1='a')
printf("%c",c1); // 输出c1 的值 (显示a)
_flushall(); //把缓冲区的值删除 (删除存在缓冲区的 \n)
scanf("%c",&c2);//再次输入值 (如 'd‘ c2=d)
printf("%c",c2); //输出c2的值 (显示d)没有_flushall()的程序变化请看下面:
scanf("%c",&c1); // 输入值 (如输入 'a'+回车键 则把第一个字符赋给c1 c1='a' ;把第二个字符赋给了c2 c2即 回车键的值)
printf("%c",c1); // 输出c1 的值 (显示a)
scanf("%c",&c2);printf("%c",c2); //输出c2的值 (显示c2='
')
如果你还有什么问题,请让我知道。另外,如果你解决了问题,请把有用的回答标记为答案。
谢谢!
Lucy
- 已编辑 lucy-liuModerator 2010年12月8日 9:43
- 已标记为答案 任一雄 2010年12月8日 11:20
-
Hi 任一雄,
1.整个过程其实是 输入设备->内存缓冲区->程序。例如
.当我们输入”abc”时,这时候缓冲区的内容是 “abc”
.用程序的scanf("%c", &c1) 语句,就把a字符保存到变量c1中,这时缓存区的内容为 “bc”,’a’被保存到内存中了。
2.>>而且连用scanf的话,缓冲区中会不断的积累曾输入的字符,那么缓冲区满的时候才会自动清除缓冲区
不是的,按第一点说的,scanf是把字符保存到变量中。键盘输入的内容会不断的积累在缓冲区。缓冲区满了不会自动清除缓冲区。
3.>>每次用scanf,敲回车输入数据,都会把一个换行符送到缓冲区
每次敲回车,都会把一个换行符送到缓冲区,和scanf无关。
如果你还有什么问题,请让我知道。另外,如果你解决了问题,请把有用的回答标记为答案。
谢谢!
Lucy
- 已标记为答案 任一雄 2010年12月8日 11:20