为了账号安全,请及时绑定邮箱和手机立即绑定

scanf跳过

scanf跳过

C
慕容森 2019-11-04 10:07:01
我试图为一个类编写一个简单的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)) */


查看完整回答
反对 回复 2019-11-04
  • 1 回答
  • 0 关注
  • 454 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信