Сканирование 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)) */