1

重複の可能性:
int配列をnulで終了します

配列内のすべての要素を出力しようとしています。

int numbers[100] = {10, 9, 0, 3, 4};
printArray(numbers); 

この関数の使用:

void printArray(int array[]) {
    int i=0;
    while(array[i]!='\0') {
        printf("%d ", array[i]);
        i++;
    }
    printf("\n");
}

問題は、もちろんCが配列内の別のゼロ要素と配列の終わりを区別せず、その後はすべて0(\ 0とも表記)になることです。

0と\0の間に文法的な違いがないことを知っているので、これを達成する方法またはハックを探していました。

10 9 0 3 4

これの代わりに

10 9

配列は次のようにもなります:{0、0、0、0}したがって、もちろん出力は0 000である必要があります。

何か案は?

4

3 に答える 3

9

配列内にある可能性のある値で配列を終了しないでください。

一意のターミネータを見つける必要があります。

配列に負の数を指定しなかったため、次のように終了することをお勧めします-1

int numbers[100] = {10, 9, 0, 3, 4, -1};

それでも問題が解決しない場合は、次のことを検討してください:INT_MAX、またはINT_MIN

最後の手段として、次のように、配列に含まれないことが保証されている一連-1, -2, -3の値をコーディングします。これは終了を示します。

0またはで終了することについて「特別な」ことは何もありません\0。ケースに適したもので終了します。


配列が本当にすべての値を任意の順序で保持できる場合、ターミネータは使用できず、配列の長さを追跡する必要があります。

あなたの例から、これは次のようになります。

int numbers[100] = {10, 9, 0, 3, 4};
int Count = 5;
int i;

for(i=0; i<Count; ++i)
{
    // do something with numbers[i]
}
于 2010-11-30T21:55:57.307 に答える
0

として宣言された配列の場合

int numbers[100] = {10, 9, 0, 3, 4};

0初期化子の明示的なものと、配列の末尾部分を初期化するために使用される暗黙的なゼロを区別する方法はまったくありません。それらは同じゼロです。ですから、あなたがやりたいことは文字通り行うことはできません。

intこれを行う唯一の方法は、予約済みの専用ターミネータ値として値を選択し、常に配列の最後に明示的に追加することです。-42つまり、ターミネータ値として選択した場合は、次のように宣言する必要があります。

int numbers[100] = {10, 9, 0, 3, 4, -42};

-42サイクルの最初まで繰り返します。

于 2010-11-30T22:09:44.303 に答える
0

これを実装する一般的な方法は次のとおりです。

  • 番兵の値を定義する(他の人が提案している)
  • int(実際の値)とbool(センチネルかどうかを示す)を使用して構造体を定義し、代わりにそれらの配列を作成します
  • 配列と配列の長さを渡します
  • 配列と長さの両方を含む構造体を定義し、代わりにそれを渡します

1番目と2番目の項目はほぼ同じであることに注意してください。

于 2010-11-30T22:18:50.860 に答える