0
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”退出程序并且没有其他字母。

4

2 回答 2

8

将调用更改scanf为:

scanf(" %c", &again);

诀窍是在%c: 之前的空格中,它指示函数在返回 N 或 Y 之前忽略任何空白字符。否则,您将读取先前调用scanf的回车符。scanf

man 3p scanf(POSIX 一):

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

那是一个复杂的功能。我建议仔细阅读手册页:它可以做的比大多数人想象的要多得多。

于 2012-09-28T22:42:11.847 回答
0

问题是scanf("%c", &again)在最后一个数字之后读取换行符,这就是循环总是中断的原因。这也是人们回避scanf()plusfgets()的原因sscanf();您往往会获得更好的诊断,并减少像这样的讨厌的陷阱。

你怎么能自己调试呢?

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

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

之后scanf()。此外,您应该检查每个scanf()调用以确保您获得预期的数据:

if (scanf("%c", &again) != 1)
    ...oops — error handling...
于 2012-09-28T22:42:45.160 回答