puchonghui 发表于 2007-12-4 22:16:00

【求助】关于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状态中按回车键,究竟是回车还是回车+换行?(文本状态下肯定是回车+换行)

愤怒的黄瓜 发表于 2007-12-5 00:21:21

你这个我也遇到过,而且自己解决过,也分析过,不过很久米有关注这个,差不多忘光了当初是怎么明白的,汗一下,说了一堆废话,但还是有点儿作用,就是帮你顶了一下……

没有功劳也有我顶你的苦劳啊,也看看我敲了这么多字儿的份儿……

gyy 发表于 2007-12-5 13:32:38


scanf ("%c",&c);
这句改成
c=getch();

gyy 发表于 2007-12-5 13:36:49

忘记说了,如果不要回显字符的话,就用getch()可以了

puchonghui 发表于 2007-12-5 16:58:20

。。。
我不是要解决方案
解决方案我自己都写了。。。

我是要谁给我个解释:Q :Q :Q :Q :Q

gyy 发表于 2007-12-6 20:16:25

我又找到个办法,既用scanf,又不用fflush
只要把
scanf("%c",&c");
改成
scanf("%1s",&c");
就可以了

HAPPY_TOM 发表于 2007-12-6 21:59:31

关于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;
}

因为你在输入时其实你是输入了两个字符。
一个是你想输入的字符,别一个是你的回车符。
它也要算一个字符,但它是不可见的字符。

puchonghui 发表于 2007-12-6 22:18:36

谢谢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状态中按回车键,究竟是回车还是回车+换行?(文本状态下肯定是回车+换行)

CCTV果冻爽 发表于 2007-12-10 21:55:43

看看了

puchonghui 发表于 2007-12-12 07:28:45

自己顶一下。。。:$

jasonxu 发表于 2007-12-12 15:42:05

学习了,最好什么方式简单用什么,用最简单的方式解决问题~

jasonxu 发表于 2008-1-9 21:38:14

顶大熊。。。。。。。:victory:

123czq 发表于 2008-1-9 23:10:42

原因应该就是第二次scanf把上次的回车给接收了吧。建议把比较奇怪的结果发上来看看就更好分析了

[ 本帖最后由 123czq 于 2008-1-9 23:12 编辑 ]
页: [1]
查看完整版本: 【求助】关于c语言中scanf的一个问题