0

入力として整数(たとえば、数値1000)を取り、数値を個々の数字(この場合は1、0、0、0)に分割し、各数字を数字と呼ばれる配列に割り当てるCの次の関数があります:

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);

ご覧のとおり、数字配列を使用する他の関数もいくつか使用しています。これらの関数は正常に動作しているように見えますが、数字の配列が変更されていないため、2 回目のループでは正しい結果が得られません。出力は次のとおりです。

ループ数: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」を呼び出すたびに、i がインクリメントされます。splitnumber の最初の呼び出し中、i はおそらく 0 であり、その呼び出し中に 3 に増加します。これは、数字の最初の 4 つのエントリに影響します (これはおそらく再び int[4] としてグローバルに宣言されます)。2 回目に splitnumber を呼び出すと、i は 4 のままです。したがって、今回は digit[4 5 6 and 7] の値を変更します。

私の推測が正しければ、セグメンテーション違反が原因でプログラムがクラッシュしないことは幸運です。割り当てたことのないメモリ (すべて digit[i]; i > 3) にアクセスしようとしています。

追加するだけ

i = 0;

splitnumber の先頭にあると、問題が解決します。関数でローカル変数を使用すると、さらに問題が解決する場合があります。

于 2013-03-14T18:15:37.227 に答える
0

はinにi初期化されていないため、の各要素を1 回だけ設定します... 後続の呼び出しは配列の境界を超えます。0splitnumberdigits

于 2013-03-14T18:18:13.617 に答える