私はinput()
単にそれに渡され、いくつかの予め設定された文字列とその文字列を比較することによって整数に対応するリターン(2文字の長さ)は、文字列を比較する関数:
int input(char *ch){
if(strcmp(ch, "AZ") == 0){
return 1;
}
else if(strcmp(ch, "BY") == 0){
return 2;
}
else if(strcmp(ch, "CX") == 0){
return 3;
}
}
いくつかのテストケースを含む入力セットがあります(各ケースは整数N
で始まり、後続のN
入力にはいくつかの文字列が含まれます。テストケースはN
asの値で終わります0
):
2
AZ BY
2
AZ CX
1
AZ
3
AZ CX AZ
4
BY AZ CX BY
0
正しい出力は次のとおりです。
1 2 1 3 1 1 3 1 2 1 3 2
次に、出力を取得するために以下のコードを実行しようとしました。
int main()
{
int i, j, N, array[100];
char ch[2];
while((scanf("%d", &N) == 1) && N != 0){
for(i=0; i<N; i++){
scanf("%s", ch);
array[i] = input(ch);
printf("%d ", array[i]);
}
}
return 0;
}
上記のコードには正確な出力が含まれています。しかし、以下のコードを実行すると、出力が間違っています。
int main()
{
int i, j, N, array[100];
char ch[2];
while((scanf("%d", &N) == 1) && N != 0){
for(i=0; i<N; i++){
scanf("%s", ch);
array[i] = input(ch);
}
for(j=0; j<N; j++){
printf("%d ", array[j]);
}
}
return 0;
}
2番目のスニペットの出力は次のとおりです。
0 2 0 3 1 0 3 1 0 1 3 2
これらの2つのスニペットの根本的な違いと、これら2つのケースで出力が異なる理由を推測することすらできませんでした。2番目のコードでは、forループの同じ反復を使用しましたが、配列は1番目のforループで割り当てられた値を保持しているはずです。array[]
2つのforループの間の値を操作しているステートメントは他にありません。では、なぜ異なる出力なのか?誰かがこの問題について私を助けてください。
Cの文字列は、文字のシーケンスとそれに続く終了ヌルバイトです。したがって、2文字の文字列を格納するには、少なくとも3要素の長さの配列が必要です。
配列は2つしか保持しません。その結果、配列に2文字の文字列を書き込むと、ヌルバイトが書き込まれるときに配列の終わりを超えて書き込まれます。配列の終わりを超えて書き込むと、未定義の動作が発生します。この結果、コードは正しく実行されているように見えるかもしれませんが、一見無関係に見える変更により、結果が変更されたり、クラッシュしたりする可能性があります。
配列を少なくとも3文字の長さにします。
char ch[3];
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加