scanf被跳过
我想为一个类做一个简单的C程序,其中一个要求就是我需要使用scanf
/ printf
来处理所有的input和输出。 我的问题是,为什么我的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
来“修复”它,但是我宁愿只使用它。
stdin
前一个int
之后的stdin
的换行符不会被最后一次调用scanf()
。 所以在for
循环之后对scanf()
的调用会消耗换行符,并且不需要用户input任何内容。
要更正而不必添加另一个scanf()
调用,可以在for
循环之后的scanf()
使用格式说明符" %c"
。 这将使scanf()
跳过任何前导空白字符(包括换行符)。 请注意,这意味着用户将不得不input新行以外的内容来结束程序。
另外:
-
检查
scanf()
的结果,以确保它实际赋值给传入的variables:/* 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)) */