【求助】关于c语言中scanf的一个问题
今天帮同学调试程序时发现一个问题类似代码如下:(源程序太长不高兴贴了:$)
#include "stdio.h"
int main(int argc,char *argv[]) {
int i;
for (i = 0; i < 5; i++) {
char c;
scanf ("%c",&c);
printf("para%d=%c\n",i,c);
printf("*********\n");
}
return 0;
}
执行结果比较奇怪
当时我的第一反应是scanf的时候由于输入完一个字符按了回车,可能接收了不止一个字符
于是改成了scanf(" %c",&c);程序可以正常执行
然后我就想
既然scanf里的第一个字符串是对格式的约定
那么能不能用scanf("%c\n",&c);呢
试了一下发觉居然不行
很郁闷的上网找了下资料
有一个解决办法是在scanf后加一句清空缓存的语句:fflush(stdin);
这样是没问题的
但是我还是想不明白
1 为什么scaf("%c\n",&c); 执行会不正常呢?
(网上查到的解释是:
“用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d",&a)也会出现同样的问题。”
那如果这样的话,我用scaf("%ca",&c);为什么还是不行。。。)
2 在console状态中按回车键,究竟是回车还是回车+换行?(文本状态下肯定是回车+换行) 你这个我也遇到过,而且自己解决过,也分析过,不过很久米有关注这个,差不多忘光了当初是怎么明白的,汗一下,说了一堆废话,但还是有点儿作用,就是帮你顶了一下……
没有功劳也有我顶你的苦劳啊,也看看我敲了这么多字儿的份儿…… 把
scanf ("%c",&c);
这句改成
c=getch();
吧 忘记说了,如果不要回显字符的话,就用getch()可以了 。。。
我不是要解决方案
解决方案我自己都写了。。。
我是要谁给我个解释:Q :Q :Q :Q :Q 我又找到个办法,既用scanf,又不用fflush
只要把
scanf("%c",&c");
改成
scanf("%1s",&c");
就可以了
关于scanf 问题的回复
关于这个scanf输入的问题有两个解决的方法如下:方法一:
#include "stdio.h"
int main(int argc,char *argv[])
{
int i;
for (i = 0; i < 5; i++) {
char c;
scanf ("%c",&c);
getchar();//吃掉回车符
printf("para%d=%c\n",i,c);
printf("*********\n");
}
return 0;
}
方法二:
#include "stdio.h"
int main(int argc,char *argv[])
{
int i;
for (i = 0; i < 5; i++) {
char c;
fflush(stdin);//清空输入缓冲区
scanf ("%c",&c);
printf("para%d=%c\n",i,c);
printf("*********\n");
}
return 0;
}
因为你在输入时其实你是输入了两个字符。
一个是你想输入的字符,别一个是你的回车符。
它也要算一个字符,但它是不可见的字符。 谢谢ls的回复
不过我问的不是解决方案:Q :Q :Q
原帖由 puchonghui 于 2007-12-4 22:16 发表 http://bbs.51testing.com/images/common/back.gif
但是我还是想不明白
1 为什么scaf("%c\n",&c); 执行会不正常呢?
(网上查到的解释是:
“用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d",&a)也会出现同样的问题。”
那如果这样的话,我用scaf("%ca",&c);为什么还是不行。。。)
2 在console状态中按回车键,究竟是回车还是回车+换行?(文本状态下肯定是回车+换行) 看看了 自己顶一下。。。:$ 学习了,最好什么方式简单用什么,用最简单的方式解决问题~ 顶大熊。。。。。。。:victory: 原因应该就是第二次scanf把上次的回车给接收了吧。建议把比较奇怪的结果发上来看看就更好分析了
[ 本帖最后由 123czq 于 2008-1-9 23:12 编辑 ]
页:
[1]