c - scanf 不起作用(整数)

标签 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:请原谅我的英语不好,我不是母语,我的英语也不是很好。

最佳答案

您的 scanf 非常完美。

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

更改循环:

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

        }

但是,如果您可以避免在 for 循环内使用 break,请不要使用它。 对于复杂的算法,您可以使用干净的代码,但是当您阅读循环时,通常您会明白该循环执行了精确的迭代次数。如果您有另一个标志来结束循环,请使用 while

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

        }

关于c - scanf 不起作用(整数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30094800/

相关文章:

c++ - 需要维护秩序的多线程作业

python - 快速 PDF 分割器库

c - 使用 fscanf 和 delimeter c 扫描整数

c - 如何扫描一个字符串、一个管道,然后扫描另一个字符串,中间没有任何中断/空格?

c - gcc 是否将长字符串初始化为 `""` 而不是短字符串?

c - Vfork() 和更多腐败

C - 从标准输入(或从文件重定向)读取字符串和整数

c - 如何在每 1000 个值后停止无限循环?

c - 如何绑定(bind)/连接多个 UDP 套接字

objective-c - XCode 在没有 UI 的 iPhone 应用程序的错误测试中使用 scanf()