Сканирование Scanf

Я пытаюсь сделать простую программу на C для класса, и одно из требований заключается в том, что я должен использовать scanf/printf для всего ввода и вывода. Мой вопрос: почему мой scanf после того, как цикл for в main пропускается и программа просто завершается.

Вот мой код

#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 после первого, но я бы предпочел просто использовать тот.

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)) */
    
Другие вопросы по тегам