【问题标题】:C Programming: Loop function which assigns to arrayC编程:分配给数组的循环函数
【发布时间】:2013-03-14 17:59:06
【问题描述】:

我在 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

循环正在递增数字计数器,但同样,数字数组没有被更新。

【问题讨论】:

  • digits 数组声明在哪里?它在哪里被清除?
  • factori 在哪里初始化?请始终发布您运行的实际代码,包括所有声明/定义。

标签: c arrays function loops


【解决方案1】:

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

在你的函数“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 开头将解决您的问题。在函数中使用局部变量可能会解决更多问题。

【讨论】:

  • 谢谢!你是对的, i = 0 是全局声明的。将它移到函数内部解决了这个问题。
【解决方案2】:

由于splitnumber中的i没有初始化为0,所以你只会设置digits的每个元素一次……后续调用会超出数组的边界。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 2023-03-18
    • 2020-10-09
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多