猿问

scanf跳过

我试图为一个类编写一个简单的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在第一个之后添加另一个相同项来“修复”它,但是我宁愿只使用一个。


慕容森
浏览 455回答 1
1回答

潇潇雨雨

输入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.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Note 'a' could be removed entirely and&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;replace with: if (isPrime(x)) */
随时随地看视频慕课网APP
我要回答