scanf пропускают

Я пытаюсь сделать простую программу C для класса, и одно из требований заключается в том, что я должен использовать scanf/printf для всех входных и выходных данных. Мой вопрос в том, почему мой scanf после цикла 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 после первого, но я бы предпочел просто использовать его.


person Austin Davis    schedule 23.01.2013    source источник
comment
Вы пробовали system("PAUSE");?   -  person Cole Johnson    schedule 23.01.2013
comment
это доступно на чистом C или только на C++?   -  person Austin Davis    schedule 23.01.2013
comment
Стойка c. Заметили отсутствие пространства имен?   -  person Cole Johnson    schedule 24.01.2013


Ответы (1)


Символ новой строки, присутствующий в stdin после ввода предыдущего int, не будет использован при последнем вызове scanf(). Таким образом, вызов scanf() после цикла for потребляет символ новой строки и продолжается без необходимости ввода пользователем чего-либо.

Чтобы исправить, не добавляя еще один вызов scanf(), вы можете использовать спецификатор формата " %c" в scanf() после цикла for. Это заставит scanf() пропускать любые начальные пробельные символы (включая новую строку). Обратите внимание, что это означает, что пользователю нужно будет ввести что-то другое, кроме новой строки, чтобы завершить программу.

Кроме того:

  • проверьте результат 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)) */
    
person hmjd    schedule 23.01.2013
comment
Почему он не был использован при последнем вызове scanf()? Извините, новый вопрос - person SSH This; 23.01.2013
comment
@SSHThis, scanf("%d") перестает потреблять, когда встречает что-то, что не является цифрой, а новая строка не является цифрой, поэтому она останется. - person hmjd; 23.01.2013
comment
спасибо, что поймали эту ошибку - person Austin Davis; 23.01.2013
comment
Спасибо, должно быть scanf("%d\n", &userValue);? - person SSH This; 23.01.2013
comment
@SSHЭто, да. Это тоже сработает. - person hmjd; 23.01.2013
comment
Или используйте C++ с std::cin - person Cole Johnson; 23.01.2013