扫描输入后C程序冻结

时间:2015-01-29 07:35:31

标签: c scanf

我正在完成家庭作业,以计算用户选择的第n个素数。我有这个工作得很好,并且相当快,但我决定添加一个错误消息,如果用户输入任何大于50000.由于某种原因,这决定不工作,所以我把它拿出来。之后,一旦用户输入他们想要的素数,我的程序就会冻结。

#include <stdio.h>

int main(void) 
{   
    long int pFactor,test,nthCount,target,result,notPrime;
    test=2;
    nthCount=0;
    printf("Which prime number do you want to know?");
    scanf("%li",&target);
    while (nthCount<target)
    {   
        for(pFactor=test/2;pFactor>1;pFactor--)
        {
            notPrime=0;
            result=(test%pFactor);
            if(result==0)
            {
                notPrime=1;
                break;
            }
            if(notPrime!=1)
            {   
                nthCount++;
                notPrime=0;
                test++;
            }
        }
    }
    test--;
    printf("The %li prime number is %li.\n",target,test);
    return 0;
}

我认为这与scanf相关,就像我试图打印之后的任何内容都没有出来。

3 个答案:

答案 0 :(得分:6)

for(pFactor=test/2;pFactor>1;pFactor--) // where test = 2

推断, pFactor&gt; 1 总是 false(1&gt; 1)

因此,流程永远不会进入for循环,因此nthCount始终保持0

while (nthCount<target) // becomes an infinite loop

答案 1 :(得分:0)

你的程序陷入无限循环。对于所有情况,for循环的主体都是无法访问的,并导致while循环运行无限时间。修改你的程序并在下次自己调试你的程序。

答案 2 :(得分:0)

在这种情况下(程序冻结),您通常可以通过进行一些观察来快速找到问题的根源。

首先,找出它是否是无限循环或阻止程序流的某些功能。 100%CPU使用率是失控循环的良好指标,0%CPU使用率是指示程序阻塞的良好指标,即等待某些事件发生。在你的情况下,你可能已经注意到它是第一个:无限循环。

然后试着找出发生这种情况的原因和原因。例如,您可以在可疑循环中的战略位置添加调试输出。你可以调整你的循环体:

while (nthCount<target)
{   
    /* added debug output: */
    printf("%ld, %ld, %ld\n", target, nthCount, pFactor);
    for(pFactor=test/2;pFactor>1;pFactor--)
    {
        /* omitted for the sake of brevity */
    }
}

运行它,你会看到类似这样的东西:

$ gcc test.cc && echo 1 | ./a.out | head
Which prime number do you want to know?1
1, 0, 0
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1

在这里你可以看到外部循环无限旋转,因为内部循环从不执行(最后一个数字总是小于或等于1),因此外部循环的循环条件永远不会改变(因此永远不会错误) 。这是你可以开始修复它的地方。