2012-09-28 109 views
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”退出程序并且没有其他字母。Broken Do/While Loop

+1

是什么'again'? – squiguy

+0

它在while循环中变化... –

+0

顺便说一句,你不应该写'} while(again!='N')'? – rodrigo

回答

8

更改scanf呼吁:

scanf(" %c", &again); 

的诀窍是在%c前的空间:它指示scanf函数返回你的N或Y.否则你会被读取之前忽略任何空白字符从以前的scanf电话返回马车。

man 3p scanf(POSIX的一个):

的一个或多个空白字符构成的指示字应通过读取输入来执行,直到没有更多的有效输入可以被读取,或至多 第一字节不是空白字符,它仍然未读。

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

+0

啊,修好了:)谢谢。 –

+0

@iccthedral:C中的指令是什么? AFAIK,'scanf'是一个函数。 – rodrigo

+1

@iccthedral:啊!他们被称为_directives_,而不是指令。您可以在_scanf_函数的任何_good_参考(如POSIX手册页(请参阅更新后的答案中的链接))中阅读它。 – rodrigo

0

问题是scanf("%c", &again)在最后一个数字之后读取换行符,这就是循环总是中断的原因。这也是为什么人们回避scanf()有利于fgets()sscanf();你往往会得到更好的诊断和更少的讨厌的陷阱。

你怎么可以自己调试呢?

您可能已经打印的,因为它被读出数据 - 增加:

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

scanf()后。此外,你应该检查每个scanf()通话,以确保你所得到的数据,你希望:

if (scanf("%c", &again) != 1) 
    ...oops — error handling...