红联Linux门户
Linux帮助

C程序“scanf("%c",&tag);”被忽略

发布时间:2009-10-17 19:08:30来源:红联作者:寻路行者
[i=s] 本帖最后由 寻路行者 于 2009-10-17 19:13 编辑 [/i]

[font=宋体]这是本人写的一个猜数程序,编译运行发现了一个问题,当猜数猜错的时候,“scanf("%c",&tag);”语句没有被运行,循环体直接退出。自己找了很久,也测试过,也修改过,就是“scanf("%c",&tag);”不能运行。把它修改为“tag=getchar();”语句,同样是不能运行。在“scanf("%c",&tag);”语句上方和下方各添加一条“printf("%c\n",tag);”语句,只有上方的“printf("%c\n",tag);”语句打印出“y”,下方的没有打印出什么结果。把“scanf("%c",&tag);”语句换为“tag='y';”语句,循环体能循环运行,直到猜对数字才能退出循环体。想来想去,始终找不出问题出在哪。以下是源代码。希望得到大家的指点![/font]
/**************************************************************/
#include
#include
#include

int fun_num(void);

int main(void)
{
char tag='y';
int g_num;
while(tag=='y')
{
printf("Please Input Your Guessing Number(0-9):\n");
scanf("%d",&g_num);
if(g_num==fun_num())
{
printf("Congratulations!\n");
break;
}
else
{
printf("You are so unlucky!\n");
printf("Do you want to try again?(y/n)\n");
scanf("%c",&tag);
}
}
return 0;
exit(0);
}

int fun_num(void)
{
int no;
srand(time(NULL));
no=rand()%10;
return no;
}
/**************************************************************/
程序运行的结果:
[attach]21092[/attach]
文章评论

共有 10 条评论

  1. tamialiu3 于 2009-11-23 22:29:43发表:

    是输入缓冲区的残余字符问题 把

    一般的C书上都会指出来的啦 关于scanf() printf()格式问题

    哈哈

  2. liuchun12255 于 2009-11-23 20:58:49发表:

    好东西

  3. zailushang 于 2009-11-08 19:52:35发表:

    也可用fflush(stdin);

    #include
    #include
    #include

    int fun_num(void);

    int main(void)
    {
    char tag='y';
    int g_num;
    while(tag=='y')
    {
    printf("Please Input Your Guessing Number(0-9):\n");
    scanf("%d",&g_num);
    if(g_num==fun_num())
    {
    printf("Congratulations!\n");
    break;
    }
    else
    {
    printf("You are so unlucky!\n");
    printf("Do you want to try again?(y/n)\n");
    fflush(stdin);
    scanf("%c",&tag);
    fflush(stdin);
    }
    }
    return 0;
    exit(0);
    }

    int fun_num(void)
    {
    int no;
    srand(time(NULL));
    no=rand()%10;
    return no;
    }

  4. jiangxhr 于 2009-11-08 12:43:22发表:

    printf("Do you want to try again?(y/n)\n");
    scanf("%c",&tag);
    这个是因为\n是两个字符,会被scanf吸收掉,你不妨再把tag打印出来,用%d打印,会显示10(或者13,记得不是很清楚了),解决这个方法除了前面加while (getchar()!='\n');,还有一个比较快捷的解决方法,就是写成scanf(" %c",&tag);(第一个双引号和%c之间加一个空格)。
    或者把printf("Do you want to try again?(y/n)\n");中最后的\n去掉也可以,请楼主尝试一下

  5. key120 于 2009-10-31 22:59:24发表:

    scanf前最好都加上while (getchar()!='\n');这一句
    不错 记住!

  6. guorui860311 于 2009-10-30 21:37:57发表:

    学习一下了。。。

  7. 寻路行者 于 2009-10-17 22:54:11发表:

    4# alick
    呵呵……漏了一个“;”。现在问题是解决了,还是有点不明白。这种问题,我还是第一次撞见。谢谢你!

  8. alick 于 2009-10-17 22:02:41发表:

    3# 寻路行者


    那是因为那一句你写错了。应该是:[code]while (getchar() != '\n');[/code]我试过了,没问题~

  9. 寻路行者 于 2009-10-17 21:46:51发表:

    2# alick
    添加“while(getchar!='\n')”后,可以实现循环,但“scanf("%c",&tag);”语句依然如同虚设。
    [attach]21105[/attach]

  10. alick 于 2009-10-17 19:15:32发表:

    需要吃字符的!scanf前最好都加上while (getchar()!='\n');这一句,
    把缓冲区内的字符(包括换行符)都吃掉。