Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 永久循环有问题吗_C - Fatal编程技术网

C 永久循环有问题吗

C 永久循环有问题吗,c,C,但是如果我把它改成 while(copy>0) 它正在工作…我试图弄清楚它为什么会永远循环,但我找不到答案..我正在递减复制,当它得到0时,它应该会从循环中断..我甚至添加了另一个检查 while(copy>1) 但是它仍然不起作用。有什么建议吗?谢谢你在copy=0时也在使用%。这是一个导致未定义行为的bug(除以零) prevcounter未初始化 代码如下所示:- if(copy==0)break; #包括 int main(){ int n,复制,计数器=0,前置计数器

但是如果我把它改成

while(copy>0)
它正在工作…我试图弄清楚它为什么会永远循环,但我找不到答案..我正在递减复制,当它得到0时,它应该会从循环中断..我甚至添加了另一个检查

while(copy>1)

但是它仍然不起作用。有什么建议吗?谢谢你在
copy=0时也在使用
%
。这是一个导致未定义行为的bug(除以零)

prevcounter
未初始化

代码如下所示:-

if(copy==0)break;
#包括
int main(){
int n,复制,计数器=0,前置计数器=0,前置;
scanf(“%d”和“&n”);
而(n>0)
{
计数器=0;
n--;
拷贝=n;
同时(复制>0)
{
--抄袭;
如果(复制(&n%copy==0){
计数器++;
}
}
如果(计数器>前置计数器){
前置计数器=计数器;
prev=n;
}
}
printf(“%d”,上一页);
}

您需要考虑在执行过程中可能出现的<>代码>拷贝/代码>的所有值。在此循环中,您将排除

copy
变为零的情况,并且
if(copy&&n%copy==0)
也确保了当
copy=0时您正在使用
%
。这是一个导致未定义行为的bug(除以零)

prevcounter
未初始化

代码如下所示:-

if(copy==0)break;
#包括
int main(){
int n,复制,计数器=0,前置计数器=0,前置;
scanf(“%d”和“&n”);
而(n>0)
{
计数器=0;
n--;
拷贝=n;
同时(复制>0)
{
--抄袭;
如果(复制(&n%copy==0){
计数器++;
}
}
如果(计数器>前置计数器){
前置计数器=计数器;
prev=n;
}
}
printf(“%d”,上一页);
}

您需要考虑在执行过程中可能出现的<>代码>拷贝/代码>的所有值。在此循环中,您将排除

copy
变为零的情况,并且
if(copy&&n%copy==0)
确保在初始化前使用
prevcounter
。这意味着
prevcounter
的值将是不确定的(并且看起来是随机的)。此外,如果循环以
copy==1
进入,则您执行
--copy
制作
copy==0
。在除法中使用它,导致被零除法和未定义的行为。我建议您这样做,因为如果在调试器中单步执行代码,这个问题应该非常明显(尽管即使在逻辑上考虑它时也很明显)时,在
if(n%copy==0){
中执行0除法。while
循环中
的缩进不良使代码具有欺骗性。奇怪的是,
if(copy==0)break;
作为
while(copy>0)中的最后一条语句
循环。您应该重新考虑您尝试执行的任何操作的逻辑。在初始化之前使用
prevcounter
。这意味着
prevcounter
的值将是不确定的(并且看起来是随机的)。此外,如果循环以
copy==1
的形式进入,则执行
--copy
生成
copy==0
。然后在除法中使用它,导致被零除法和未定义的行为。我建议您这样做,因为如果在调试器中单步执行代码,这个问题应该非常明显(即使从逻辑上考虑,这一点也很明显。)我认为当执行
if(copy==0)break;
时,在
if(n%copy==0){
中执行0除法。
while
循环中的缩进不良使得代码具有欺骗性。看到
if(copy==0)很奇怪break;
作为
while(copy>0)
循环中的最后一条语句。你应该重新思考你正在尝试做的任何事情的逻辑。谢谢你解决了这个问题。关于模:D我会记住的谢谢你解决了这个问题。关于模:D我会记住的
#include <stdio.h>

int main(){
    int n,copy,counter=0,prevcounter=0,prev;
    scanf("%d",&n);
    while(n>0)
    {
        counter = 0;
        n--;
        copy = n;
        while(copy>0)
        {
            --copy;

            if(copy && n%copy==0){
                counter++;
            }

        }
        if(counter>prevcounter){
            prevcounter = counter;
            prev = n;
        }
    }
    printf("%d",prev);
}