8

我正在尝试为一个类制作一个简单的 C 程序,其中一个要求是我需要对所有输入和输出使用scanf/ printf。我的问题是为什么我scanf在 main 中的 for 循环之后被跳过并且程序刚刚终止。

这是我的代码

#include <stdio.h>

void main() {
    int userValue;
    int x;
    char c;

    printf("Enter a number : ");
    scanf("%d", &userValue);
    printf("The odd prime values are:\n");
    for (x = 3; x <= userValue; x = x + 2) {
        int a;
        a = isPrime(x);
        if (a = 1) { 
            printf("%d is an odd prime\n", x);
        }
    }   
    printf("hit anything to terminate...");
    scanf("%c", &c);    
}

int isPrime(int number) {
    int i;
    for (i = 2; i < number; i++) {
        if (number % i == 0 && i != number)
            return 0;
    }
    return 1;
}

我可以通过在第一个之后添加另一个相同的来“修复”它scanf,但我更愿意只使用一个。

4

1 回答 1

22

stdin输入前一个后出现的换行符int不会被最后一次调用消耗掉scanf()。因此,对scanf()afterfor循环的调用会消耗换行符并继续,而无需用户输入任何内容。

要更正而不必添加另一个调用,您可以在循环后scanf()使用格式说明符。这将跳过任何前导空白字符(包括换行符)。请注意,这意味着用户必须输入除换行符以外的其他内容才能结束程序。" %c"scanf()forscanf()

此外:

  • 检查结果scanf()以确保它实际上为传入的变量赋值:

    /* scanf() returns number of assigments made. */
    if (scanf("%d", &userValue) == 1)
    
  • 这是一个任务(并且永远是真的):

    if (a = 1){ /* Use == for equality check.
                   Note 'a' could be removed entirely and
                   replace with: if (isPrime(x)) */
    
于 2013-01-23T16:29:03.173 回答