8

私は C の真の初心者ですが、学んでいます!

以前にこの問題に出くわしたことがあり、その理由を尋ねることにしました。そして、私が学べるようにあなたの答えを説明してください.

5 文字を入力して、書いた文字を表示し、元に戻すことができるプログラムを作成しました。例: "asdfg" - "gfdsa"。奇妙なことに、入力された元の文字の後に奇妙な文字が表示されます。

コードは次のとおりです。

char str[5];
char outcome[] = "OOOOO";
int i;
int u;

printf("Enter five characters\n");

scanf("%s", str);

for(i = 4, u = 0; i >=0; u++, i--){
    outcome[i] = str[u];
}

printf("\nYou wrote: %s. The outcome is: %s.", str , outcome);


return 0;

「asdfg」と入力すると、「asdfg♣」と表示されますが、これはなぜですか?

お時間をいただきありがとうございます。答えを説明してください:)

4

2 に答える 2

21

nullターミネータがないためです。C では、「文字列」は、ヌル ターミネータ ( '\0') と呼ばれるセンチネル文字で終わる連続したバイト (文字) のシーケンスです。コードはユーザーからの入力を受け取り、5 文字すべてを埋めるため、文字列に「終わり」はありません。次に、文字列を出力すると、5 文字 ( "asdfg") が出力され、ヌル ターミネータに到達するまでスタックにあるガベージが出力され続けます。

char str[6] = {'\0'}; //5 + 1 for '\0', initialize it to an empty string
...
printf("Enter five characters\n");
scanf("%5s", str);  // limit the input to 5 characters

limit format specifier の優れた点は、入力が 5 文字より長い場合でも、文字列に格納されるのは 5 文字だけであり、null ターミネータの余地が常に残されていることです。

于 2013-03-22T18:11:29.757 に答える
2

あなたの文字列str[5];は短すぎます。

そのはず

str[6];

そして、それを印刷すると、コードはその配列の範囲外になります。

また、配列の終わりを示すために、null 終端文字を str[] 配列に設定する必要があります。

str[5] = '\0'
于 2013-03-22T18:10:22.343 に答える