我试图为一个类编写一个简单的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在第一个之后添加另一个相同项来“修复”它,但是我宁愿只使用一个。
1 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
输入stdin上一个字符后出现的换行字符int不会被最后一次调用所占用scanf()。因此,scanf()在for循环之后对to的调用将占用换行符,并且无需用户输入任何内容即可继续进行。
要进行纠正而不必添加其他scanf()调用,可以在循环之后的format说明符" %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)) */
- 1 回答
- 0 关注
- 454 浏览
添加回答
举报
0/150
提交
取消