0

次のコードの何が問題なのかわかりません。たぶんscanf_s、文字列名をスキャンしません。

int main(void)
{
    char *name[20]; 
    printf("What is your name>");
    scanf_s("%s", name);
    printf("Your name is %s\n", name);

    return 0;
}

変更しましたが、まだ機能しません:

char *name[20]; 
{
    printf("What is your name>");
    scanf_s("%19s", name);
    printf("Your name is %s\n", name);
    return 0;
}

はい、次の作品ありがとう!!!!!!!!

int main(void) 
{
    char *name[20]; 
    printf("What is your name>");
    scanf_s("%s", name, 20);
    printf("Your name is %s\n", name);
    return 0;
}
4

2 に答える 2

3

この線:

char *name[20];

20 文字ポインターの配列を作成します。あなたはおそらく次のことを意味していました:

char name[20];

いずれにせよ、主な問題はバッファオーバーフローであり、C標準からの次の抜粋に従ってscanf("%s")修正されました(私の太字):scanf_sC11 K.3.5.3.2 The fscanf_s function /4

fscanf_s 関数は、c、s、および [ 変換指定子が引数のペアに適用されることを除いて、fscanf と同等です(割り当ての抑制が * で示されている場合を除く)。

これらの引数の最初の引数は、fscanf の場合と同じです。この引数の直後に、引数リスト内で 2 番目の引数が続きます。この引数は、rsize_t 型を持ち、ペアの最初の引数が指す配列の要素数を示します。最初の引数がスカラー オブジェクトを指している場合、それは 1 つの要素の配列と見なされます。

したがって、正しい形式は次のようになります。

scanf_s ("%s", name, sizeof name);

附属書 K (境界チェック インターフェース) のものは標準のオプション部分であることに注意してください。利用できない場合は、ユーザー入力を取得する別の方法があります。これは、オーバーフローを停止するだけでなく、それ以上の処理も行います (単に防止するのではなく、検出して調整します)。

于 2013-09-25T02:01:58.363 に答える