断开的Do / While循环

时间:2012-09-28 22:38:13

标签: c

char again;
do {
            counter = 0;
            while (counter < 3) {
               printf("Please enter a number: ");
               scanf("%d", &num);
               counter++;
               sum += num;
            }
            if (counter == 3) {
                printf("Would you like to continue? [Y]Yes [N]No:");
                scanf("%c", &again);
            } 
        }while (again == 'Y');

我似乎无法弄清楚为什么这不起作用。如果我输入Y则会中断,如果我输入N则会中断。我需要循环,直到用户输入“N”退出程序而没有其他字母。

2 个答案:

答案 0 :(得分:8)

scanf来电更改为:

scanf(" %c", &again);

诀窍在%c之前的空格中:它指示scanf函数在返回N或Y之前忽略任何空格字符。否则你将从前一个{读取返回的车厢} {1}}来电。

来自man 3p scanf(POSIX one):

  

由一个或多个空白字符组成的指令应通过读取输入执行,直到无法读取更多有效输入,或者直到          第一个字节不是空白字符,仍然未读。

这是一项复杂的功能。我建议小心阅读手册页:它可以比大多数人想象的要多得多。

答案 1 :(得分:0)

问题是scanf("%c", &again)在最后一个数字后读取换行符,这就是循环总是中断的原因。这也是人们回避scanf()而不是fgets()的原因。你倾向于获得更好的诊断和更少的讨厌的陷阱。

你怎么能为自己调试这个?

您可以打印在读取时读取的数据 - 添加:

sscanf()
printf("Read: %d\n", again); 之后

。此外,您应该检查每个scanf()来电,以确保您获得所需的数据:

scanf()