0

我在 C 中有以下函数,它以整数作为输入(例如,数字 1000),将数字拆分为单个数字(在这种情况下为 1、0、0、0)并将每个数字分配给一个称为数字的数组:

int splitnumber(int x)
{
    temp=x;

    while(temp)
    {
        temp=temp/10;
        factor = factor*10;
    }

    while (factor>1)
    {
        factor = factor / 10;
        digits[i]= x/factor;
        x = x % factor;
       i = i + 1;
    }
}

这第一次效果很好,但如果我在循环中使用它,似乎数字数组每次都没有改变,它仍然保持与第一次相同的值。当我只是简单地尝试使用新号码再次使用该功能时也是如此,它仍然挂在第一次尝试的结果上。这是我试图在其中使用它的循环:

do
{
    splitnumber(number);

    lowhigh = sort_lowtohigh(digits);
    highlow = sort_hightolow(digits);

    printf ("\n\nLoop number is:%d\n", number);
    printf ("High to Low is: %d\n", highlow);

    printf ("Low to high is: %d", lowhigh);

    printf("\n");

    printf ("Subtraction is: %d", subtraction(highlow, lowhigh));

    number++;
} while (number <= 1020);

如您所见,我还使用了其他几个使用数字数组的函数。这些函数似乎工作正常,但在第二次循环中没有产生正确的结果,因为数字数组没有改变。这是输出:

循环数为:1001
从高到低是:1100
从低到高是:11
减法为:1089

循环数为:1002
从高到低是:1100
从低到高是:11
减法为:1089

循环数为:1003
从高到低是:1100
从低到高是:11
减法为:1089

循环正在增加数字计数器,但再次,数字数组没有被更新。

4

2 回答 2

0

我在您的代码中看到了一些问题(可能导致所描述的行为):

在您的函数“splitnumber(int x)”中:

  • 你没有局部变量(temp,i,factor)
  • "i" 永远不会被初始化!
  • 没有返回值

我相信,变量 i (可能全局声明)会导致您的问题。每次你调用“splitnumber”时,我都会增加。在第一次调用 splitnumber 期间,i 可能是 0,并且会在调用期间增长到 3。这将影响前 4 个数字条目(可能再次全局声明为 int[4])。当您第二次调用 splitnumber 时,i 仍然是 4。所以这次您更改了 digit[4 5 6 和 7] 的值。

如果我的猜测是正确的,那么您很幸运您的程序不会因分段错误而崩溃。您正在尝试访问您从未分配过的内存(所有带有 digit[i]; i > 3 的内容)。

只需添加一个

i = 0;

在 splitnumber 的开头将解决您的问题。在函数中使用局部变量可能会解决更多问题。

于 2013-03-14T18:15:37.227 回答
0

由于i未初始化为0in splitnumber,因此您只会将每个元素设置digits一次...后续调用将超出数组的范围。

于 2013-03-14T18:18:13.617 回答