0
/* Program Print Prime Numbers */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main()
{
    int *primes=NULL;
    int trial=0;
    bool found=false;
    size_t total=0;
    size_t count=0;

    printf("\nHow many primes would you like?\n");
    scanf("%d",&total);
    total=(total<4?4:total);
    printf("%d",total);

    primes= (int*)malloc(total*sizeof(int));
    if(primes==NULL)
    {
        printf("\nNot enough memory\n");
        return 1;
    }

    *primes=2;
    *(primes+1)=3;
    *(primes+2)=5;
    count=3;
    trial=5;

    while(count<total);
    {
        trial+=2;
        for(size_t i=0;i<count;i++)
            if(!(found=(trial % *(primes+i)))) 
                if(found)
                  *(primes+count++)=trial;
    }

    for(size_t i=0;i<total;i++)
    {
        if(!(i%5))
          printf("\n");
        printf("%d",*(primes+i));
    }
    printf("\n");

    return 0;
}

这是我用来学习 C 编程的书中的 C 程序。这个程序不起作用。当它应该输入“total”变量时,程序继续输入值。你想要多少个素数?4 5 10...像这样

4

4 回答 4

4

...但是当我输入“total”时它没有启动。错误在哪里?

不评论其他问题,它没有启动的原因是它进入了一个无限循环,因为你说:

while(count<total);

删除尾随;.

于 2013-10-09T11:21:05.163 回答
1

scanf()正在阻止调用读取输入,stdin直到EOL被读取。这意味着您必须启动程序,输入所需的素数并按 Enter 键,以结束输入。

编辑:一些澄清:

stdin是标准输入。默认情况下,它是键盘输入。

EOL表示行尾。这是一个字符标记行尾。

阻塞调用意味着程序停止,直到调用完成。输入的功能通常是阻塞的。非常简单地说,程序从处理器中移除,不执行任何指令,直到调用完成,解除程序阻塞。

于 2013-10-09T11:14:10.140 回答
0

只需按“Enter”按钮即可强制您的“scanf”返回其读取值

于 2013-10-09T11:17:21.840 回答
0

问题不在于scanf()enter正如某些人所建议的那样 - 这可以通过fflush在第一个printf.

我找到了您的代码的源代码,但您忘记了一点重要的东西break,这一切都不同:

while(count<total)
{
    trial+=2;
    for(size_t i=0;i<count;i++)
        if(!(found=(trial % *(primes+i))))
            break;  // <-------------------- HERE.
        if(found)
            *(primes+count++)=trial;
}

while此外,如建议的那样,在子句开头后不应有尾随分号。

于 2013-10-09T11:31:47.017 回答