0

次のコードがあります。

int main() {
    char *sPPhrase[51];

    /* Input */
    printf("Enter string (max. 50 chars):\n");
    fflush(stdout);                         /* Works around an annoying Eclipse bug that fails to display the output from the printf command */
    scanf("%s", *sPPhrase);   /* Won't work */

    /* More code goes here */
}

sPPhrasescanf()は文字列定数を指しているため、*sPPhrase は書き込み可能ではないため、コマンドは失敗すると思います。コンパイラは、何かが間違っているという手がかりを持っていません。少し後で、この文字列をこの関数に渡す必要があります。

char* reverse(char* sPPhrase[]);

文字列定数は書き込み可能ではありませんが、この char* をこの関数に渡す必要があります。コードを書き直して機能させるにはどうすればよいですか?

4

3 に答える 3

6

文字の配列ではなく、ポインターの配列を宣言しています(通常、文字列として使用されます)。

次のように宣言する必要があります。

char sPPhase[51];

また、sscanf を使用すると問題が発生する可能性があります。バウンド バッファー内の文字列を読み取るには fgets を使用することをお勧めします。

int main() {
    char sPPhrase[51];
    printf("Enter string (max. 50 chars):\n");
    fflush(stdout);
    fgets(sPPhrase, 50, stdin);  // leave one byte for '\0'

    // More code
}

「リバース」が何をしているのかはわかりませんが、おそらく次のように定義する必要があります。

char* reverse(char* sPPhrase);

その場で操作を行っている場合は、戻り値さえ必要ありません。その場合は、完了したら解放することを忘れないでください。

于 2010-01-26T17:37:46.663 に答える
0

これを理解するには、配列がメモリに実装される方法に戻る必要があります。 char* sPPhrase[51];は、ポインターへのポインターの宣言であり、2 次元配列に似ていると考えることができます。これを宣言し、scanf を呼び出して読み込むと、配列全体の値が 1 文字に等しく設定されます。これは次のように言っています。

char chars2D[50][50];
chars2D[0] = 'A';

これは、配列全体を「A」に等しく設定することで、配列のメモリアドレスが「A」になるようにします。これはメモリ内のガベージ値です。呼び出すscanf("%s", *sPPhrase);ときは、各配列の先頭を文字に等しく設定しようとすることで、問題を増やしているだけです。だからゴミが出る。

これは、 scanfを使用して文字の配列を読み取る方法を説明するスレッドです。

于 2010-01-26T17:47:30.750 に答える
0

sPPhase の宣言:

char *sPPhrase[51];

実際には 51 個のポインターの配列です。実際に必要なのは、文字の配列だけです。

char sPPhrase[51];

それを行うときは、scanfを変更する必要があります

scanf("%s",sPPhrase)

また、scanf が予想以上に読み取る可能性があることにも注意してください。

于 2010-01-26T17:41:45.830 に答える