scanf 不起作用(整数)

scanf doesn't work (integer)

当我执行我的代码时,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;

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

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

你的 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;
                }
            }

        }

esPrimo 有两个主要问题。

首先,for循环不会终止:

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

将条件更改为:

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

其次是逻辑。如果发现 n 不是质数,则需要打破循环,否则函数将始终 return 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;
        }
    }
}