forループの内側と外側の異なる値としての配列の奇妙な動作

ラキブルイスラム

私は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入力にはいくつかの文字列が含まれます。テストケースはNasの値で終わります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ループの間の値を操作しているステートメントは他にありませんでは、なぜ異なる出力なのか?誰かがこの問題について私を助けてください。

dbush

Cの文字列は、文字のシーケンスとそれに続く終了ヌルバイトです。したがって、2文字の文字列を格納するには、少なくとも3要素の長さの配列が必要です。

配列は2つしか保持しません。その結果、配列に2文字の文字列を書き込むと、ヌルバイトが書き込まれるときに配列の終わりを超えて書き込まれます。配列の終わりを超えて書き込むと、未定義の動作が発生します。この結果、コードは正しく実行されているように見えるかもしれませんが、一見無関係に見える変更により、結果が変更されたり、クラッシュしたりする可能性があります。

配列を少なくとも3文字の長さにします。

char ch[3];

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ng-includeの内側と外側の$ scopeの動作は異なります

分類Dev

CSSを使用して境界線の色が異なるHTMLの外側と内側のテーブル

分類Dev

JavaScriptで配列をループしているときの奇妙な動作

分類Dev

Javascript、ループの外側と内側から文字列値を出力することに違いがないのはなぜですか?

分類Dev

変数がループの外側で異なる動作をするのはなぜですか?

分類Dev

組み合わせ和の内側ループと外側ループを交換可能な動的計画法?

分類Dev

組み合わせ和の内側ループと外側ループを交換可能な動的計画法?

分類Dev

さまざまな個別のポリゴンの外側にあるリーフレットマップをマスクするときの奇妙な動作

分類Dev

なぜVimの色がtmuxの内側と外側で異なって見えるのですか?

分類Dev

forループで配列を変更するときの奇妙な動作

分類Dev

forループで配列を変更するときの奇妙な動作

分類Dev

Javaの内側と外側のループの混乱?

分類Dev

ggplotなぜ新しい要素を追加すると、ループの外側ではなく内側の色が上書きされるのですか?

分類Dev

Python3のリスト内のアイテムをforループとして削除する-奇妙な動作

分類Dev

ifelse()ステートメントの内側と外側で行を実行すると出力が異なる

分類Dev

ループの内側と外側の機能

分類Dev

JavaScriptのforループの内側と外側

分類Dev

ループの内側と外側のファイルにbashを追加する

分類Dev

手順の外側と内側で異なるクエリプラン(PROBEを使用したインデックスシーク)

分類Dev

yui-purecssボタンの内側で:afterとfloat:rightを使用したFirefoxの奇妙な動作

分類Dev

内側のループを終了するときに、外側のループを数回続行します(Python)

分類Dev

ループの外側で変数を宣言して異なる出力を提供し、ループの内側で異なる出力を宣言するのはなぜですか?

分類Dev

ループ内の配列を更新およびログ記録するときに奇妙な動作をするjavascriptforループ

分類Dev

配列の結果はwhileループ内では正しいが、外側では壊れている

分類Dev

条件としてi ++を使用したCforループの奇妙な動作

分類Dev

GraphQLObjectTypeの外側と内側のモジュールを必要とするGraphql

分類Dev

ループ内のコントロールを削除すると、奇妙な動作が発生します

分類Dev

forループのsetTimeout内のIIFEがnodejsでブラウザの動作と異なる動作をする理由

分類Dev

forループの内側の辞書はTypeErrorになり、forループの外側は正常に機能します

Related 関連記事

  1. 1

    ng-includeの内側と外側の$ scopeの動作は異なります

  2. 2

    CSSを使用して境界線の色が異なるHTMLの外側と内側のテーブル

  3. 3

    JavaScriptで配列をループしているときの奇妙な動作

  4. 4

    Javascript、ループの外側と内側から文字列値を出力することに違いがないのはなぜですか?

  5. 5

    変数がループの外側で異なる動作をするのはなぜですか?

  6. 6

    組み合わせ和の内側ループと外側ループを交換可能な動的計画法?

  7. 7

    組み合わせ和の内側ループと外側ループを交換可能な動的計画法?

  8. 8

    さまざまな個別のポリゴンの外側にあるリーフレットマップをマスクするときの奇妙な動作

  9. 9

    なぜVimの色がtmuxの内側と外側で異なって見えるのですか?

  10. 10

    forループで配列を変更するときの奇妙な動作

  11. 11

    forループで配列を変更するときの奇妙な動作

  12. 12

    Javaの内側と外側のループの混乱?

  13. 13

    ggplotなぜ新しい要素を追加すると、ループの外側ではなく内側の色が上書きされるのですか?

  14. 14

    Python3のリスト内のアイテムをforループとして削除する-奇妙な動作

  15. 15

    ifelse()ステートメントの内側と外側で行を実行すると出力が異なる

  16. 16

    ループの内側と外側の機能

  17. 17

    JavaScriptのforループの内側と外側

  18. 18

    ループの内側と外側のファイルにbashを追加する

  19. 19

    手順の外側と内側で異なるクエリプラン(PROBEを使用したインデックスシーク)

  20. 20

    yui-purecssボタンの内側で:afterとfloat:rightを使用したFirefoxの奇妙な動作

  21. 21

    内側のループを終了するときに、外側のループを数回続行します(Python)

  22. 22

    ループの外側で変数を宣言して異なる出力を提供し、ループの内側で異なる出力を宣言するのはなぜですか?

  23. 23

    ループ内の配列を更新およびログ記録するときに奇妙な動作をするjavascriptforループ

  24. 24

    配列の結果はwhileループ内では正しいが、外側では壊れている

  25. 25

    条件としてi ++を使用したCforループの奇妙な動作

  26. 26

    GraphQLObjectTypeの外側と内側のモジュールを必要とするGraphql

  27. 27

    ループ内のコントロールを削除すると、奇妙な動作が発生します

  28. 28

    forループのsetTimeout内のIIFEがnodejsでブラウザの動作と異なる動作をする理由

  29. 29

    forループの内側の辞書はTypeErrorになり、forループの外側は正常に機能します

ホットタグ

アーカイブ