2013-03-22 13 views
7

私は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♣"、その理由は?

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

+2

文字の配列を終了する必要があります。 http://stackoverflow.com/questions/10943033/why-are-strings-in-c-usually-terminated-with-0 –

答えて

2

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

それは

str[6]; 

する必要があり、あなたはそれを印刷する際のコードは、その配列の境界の外に出ます。

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

str[5] = '\0' 
+0

'scanf()'は ' %s'フォーマット指定子です。つまり、 '%s'と組み合わせた' scanf() 'は、バッファオーバーフローの明白で危険な存在であるため、最初は避けるべきです。代わりに 'fgets()'を使用してください。 – WhozCraig

15

ヌルターミネーターがないためです。 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 

制限フォーマットspecificerのいいところは、入力が長くなる5文字以上の場合でも、わずか5は常にそのヌル終端の余地を残して、あなたの文字列に格納されるということです。

関連する問題