2012-03-24 62 views
1

CODE:为什么这个C程序完全跳过我的输入?

#include <stdio.h> 
main() { 

    int nums[100], i; 
    char answer; 
    int count = 0; 
    double avg; 

    for (i = 0; i < 100; i++) { 
     printf("Enter number %d: ", i + 1); 
     scanf("%d", &nums[i]); 
     printf("Another? "); 
     scanf("%c", &answer); 
     count += nums[i]; 
    } 
} 

RUN:

~> a.out 
Enter number 1: 1 
Another? Enter number 2: 2 
Another? Enter number 3: 3 
Another? Enter number 4: 4 
Another? Enter number 5: 5 
Another? Enter number 6: 6 
Another? Enter number 7: 7 
Another? Enter number 8: 8 
Another? Enter number 9: 

它应该问我,如果我想进入另一个号码,但由于某些原因,scanf函数不能正常工作。另外,我需要让用户输入100个号码,或者根据提示输入另一个号码的问题。如果答案是否定的,则结束,如果是,则继续。

+0

我注意到,即使一旦你读一个字的东西整理出来你没有在输入的基础上做出任何决定...... – dmckee 2012-03-24 21:22:12

+0

是的,我知道,我这么做了,那不是我的问题。我发布的以上是。 – eveo 2012-03-24 21:26:59

回答

6

您的第一个scanf在缓冲区中留下换行符。这是因为%d忽略尾随空白,而%c没有。使用这个把戏,使第二scanf吃的空白:

scanf(" %c", &answer); 
    ^

的问题是很常见,你可以在C FAQ阅读更多关于它。

+0

+10如果我可以!我有这个问题几千次 – BlackBear 2012-03-24 21:20:20

+0

更好的解决方案是这样的:scanf(“%c%* c”,&answer);星号告诉scanf解析第二个字符,但不要将它分配给任何东西。 – 2012-03-24 21:21:57

+0

非常感谢你cnicutar。谢谢你,凯莉格雷戈里。 – eveo 2012-03-24 21:27:42

0

您需要在%c之前有一个空格,以便跳过scanf在数字结尾处停止时未读取的换行符。

我有一些不请自来的建议......

  1. 不要使用scanf(3)直接,太难让它做你想要什么。通常使用fgets(3),然后使用sscanf(3)

  2. 编译时会打开警告。 (我的Mac上,这意味着cc -Wall ...

而且有警告开启,在这里你的程序有一些修复的问题:

#include <stdio.h> 
int main(void) { 

    int nums[100], i; 
    char answer; 
    int count = 0; 
    // double avg; 

    for (i = 0; i < 100; i++) { 
     printf("Enter number %d: ", i + 1); 
     scanf(" %d", &nums[i]); 
     printf("Another? "); 
     scanf(" %c", &answer); 
     if (answer != 'y' && answer != 'Y') 
      break; 
     count += nums[i]; 
    } 
    return 0; 
} 
相关问题