scanf不起作用(整数)

时间:2015-05-07 07:42:32

标签: c scanf

当我执行我的代码时,scanf("%d", &n);不会扫描任何内容,我的意思是,如果我引入任何数字,它都不会执行任何操作,无论我引入的数字如何。

void testEsPrimo() {
    int n; 

    printf("Comprobando si un número es o no primo\n");
    printf("Teclee un número entero: ");
    fflush(stdout);

    scanf("%d", &n);  //<---- The problem ?

    if(esPrimo(n) == cierto){
        printf("%d es primo\n", n);
    }else{
        printf("%d NO es primo\n", n);
    }

    fflush(stdout);
}


Logico esPrimo(int n){
int divisor;
int esPrimox;
for(divisor = 2; sqrt(n); divisor++) {
    if(n <= 0) {
        return falso;
    } else {
        if(n%divisor == 0) {
            esPrimox = 0;
        } else {
            esPrimox =1;
        }
    }

}
if(esPrimox == 1) {
    return cierto;
}

return falso;

}

这是我的esPrimo代码,用于决定数字是否为素数。

typedef enum {falso, cierto} Logico;

这是Logico,在.h文件中定义

PD:这是我在C上的第一步,所以我的代码可能不好。 PD2:请原谅我的英语不好我不是本地人,我的英语不是很好。

2 个答案:

答案 0 :(得分:4)

您的scanf非常完美。

我认为你的错误是来自esPrimo的循环。实际上你有一个无限循环,因为sqrt(n)总是具有相同的值,并且它不是布尔表达式。

更改循环:

for(divisor = 2; sqrt(n); divisor++) {
        if(n <= 0) {
            return falso;
        } else {
            if(n%divisor == 0) {
                esPrimox = 0;
            } else {
                esPrimox =1;
            }
        }

    }

为此:

 for(divisor = 2; divisor < sqrt(n); divisor++) {
            if(n <= 0) {
                return falso;
            } else {
                if(n%divisor == 0) {
                    esPrimox = 0;
                } else {
                    esPrimox =1;
                }
            }

        }

但是当你知道你的号码不是素数时你会遇到问题:你必须完成循环。 你可以这样做:

for(divisor = 2; divisor < sqrt(n); divisor++) {
            if(n <= 0) {
                return falso;
            } else {
                if(n%divisor == 0) {
                    esPrimox = 0;
                } else {
                    esPrimox =1;
                    break;
                }
            }

        }

但如果您可以避免在循环中使用break,请不要使用它。 使用复杂的算法,您可以使用干净的代码,但是当您读取循环时,通常您会理解循环执行完全相同的迭代次数。如果您有另一个标志来结束循环,请使用while

While (divisor < sqrt(n) && esPrimox == 0){
            if(n <= 0) {
                return falso;
            } else {
                if(n%divisor == 0) {
                    esPrimox = 0;
                } else {
                    esPrimox =1;
                }
            }

        }

答案 1 :(得分:1)

esPrimo有两个主要问题。

首先,for循环不会终止:

for(divisor = 2; sqrt(n); divisor++) {

将条件更改为:

for(divisor = 2; divisor <= sqrt(n); divisor++) {

其次是逻辑。如果您发现n不是素数,则需要中断循环,否则函数将始终返回true。您可以使用break语句或在循环条件中检查esPrimox的值来执行此操作。

以下是使用break

的方法
for(divisor = 2; divisor <= sqrt(n); divisor++) {  /* fixed loop condition */
    if(n <= 0) {
        return falso;
    } else {
        if(n%divisor == 0) {
            esPrimox = 0;
            break;        /* break the loop */ 
        } else {
            esPrimox =1;
        }
    }
}