1

ユーザーからの文字列入力をN回多次元配列に格納する次のコードがあります。次に、2 番目の要素を出力します。

main()
{

    // Array to store 10 strings, 20 characters long.
    char strStorage[10][20];

    printf("\nEnter how many strings: ");
    scanf( "%d" , &num);
    fflush(stdin);

    for ( count = 0 ; count < num ; count++)
    {
        printf("Enter a string: ");
        gets(strStorage[count]);
        fflush(stdin);
    }

    printf("%s", strStorage[2]);

最後の行はガベージを出力します。ユーザー入力はガベージ内に表示されないため、要素へのアクセスが間違っているか、ストレージが間違っています。何が問題なのか、誰でも私を助けることができますか?

前もって感謝します...

4

2 に答える 2

3

strStorage[2]3番目の文字列であるため、が3num未満の場合、初期化せず、ガベージが含まれます。

于 2013-02-13T12:31:50.290 に答える
0

scanf("%d", &num);num に値が含まれていることは保証されません。おそらく、次のように scanf の戻り値をチェックして、1 つの値が読み取られることを確認するのが賢明でしょう。if (scanf("%d", &num) != 1) { puts("Error reading integer"); }

このトピックに取り組んでいる間、num と count は int として宣言されていると思いますが、あなたは宣言を私たちから隠しています。ツッスク!私たちの助けが必要ですか?もしそうなら、あなたのコードをコンパイル可能にしてください! インデックスを配列に格納するのに int が適していると本当に思いますか? 負の値を持つ可能性があります。size_t代わりに ,を使用することをお勧めします。%zuフォーマット指定子は scanf に stdin から size_t 値を期待するように指示します。

...そして、その size_t に配列の要素数よりも大きい値が含まれている場合はどうなりますか? 可変長配列の調査をお勧めします。

fflush(stdin);fflush は出力用に開いているファイルの動作を定義し、stdin は入力専用に開いているファイルであるため、ナンセンスです。それは、トイレを流して、便器から排泄物が出てくることを期待しているようなものです。行の先頭から必要なデータを読み取ったため、行の残りを破棄することを意味している可能性があります。のようなものがうまくいくfor (int c = getchar(); c >= 0 && c != '\n'; c = getchar());かもしれません。

使用しないでくださいgets。代わりに使用fgets(strStorage[count], sizeof strStorage[count], stdin);して、バッファ オーバーフローが発生しないようにします。

そこでは、未定義の動作と細かいことをほぼすべてカバーしたと思います。

于 2013-02-13T13:26:45.113 に答える