0

私は C プログラミングにまったく慣れていないので、遠慮なく訂正してください。C の文字列に関する私の基本的な理解は、文字列を初期化すると、文字列の最後に null 文字が自動的に割り当てられ、null 文字は読み書きできず、内部でのみ使用されるということです。

したがって、サイズ 4 の文字列を作成し、char str[3]それに「RED」という単語を割り当てて puts 関数または を使用してprintf("%s",str)出力すると、異常な出力が次のように出力されます。RED(SMIILEY FACE)

次に、文字列のサイズを再度縮小してchar str[2]RED を割り当て、コンパイルすると、次のような出力が返されますRE(Smiley face)

誰かが私にそれを説明できるなら、私は感謝します. 以下にCコードを投稿する

    int main()
{

 char s1[3]="RED";
 char s2[]="RED";
 puts(s1);
 puts(s2);
 printf("%s",s1);
 return 0;
}
4

2 に答える 2

4
char s1[3] = "RED";

有効なステートメントです。定数文字列リテラル (4 文字の長さ) から3"RED"文字を文字配列にコピーしs1ます。で終端'\0'するs1余地がないため、終端はありません。

copyに注意してください。s1は変更可能ですが、 は変更"RED"できないためです。const char *s1 = "RED";これにより、たとえば、文字列がコピーされないステートメントとは異なります。

puts(s1)との両方の結果printf("%s", s1)は未定義です。での終端はありませ'\0's1。これを 1 の文字列として扱うと、任意の動作につながる可能性があります。

char s2[] = "RED";

ここでsizeof(s2) == 4、 は 4 文字であるため、スペースを計算するとき"RED"に末尾をカウントする必要があります。'\0'

于 2015-11-21T10:30:50.367 に答える