私はC言語には新しく、文字列に終端の '\ 0'文字を手動で追加する必要があるときはちょっと混乱しています。 (明瞭のために)文字列の長さを計算するために、この機能を考える:なぜC文字列に終端文字 ' 0'を含めるべきか?
int stringLength(char string[])
{
int i = 0;
while (string[i] != '\0') {
i++;
}
return i;
}
ヌル終端文字に基づいて文字列の長さを計算します。したがって、次の場合を使用して、 '\ 0'文字の役割は何ですか?
ケース1:
char * stack1 = "stack";
printf("WORD %s\n", stack1);
printf("Length %d\n", stringLength(stack1));
プリント:
WORD stack
Length 5
ケース2:
char stack2[5] = "stack";
printf("WORD %s\n", stack2);
printf("Length %d\n", stringLength(stack2));
プリント:
WORD stack���
Length 8
(これらの結果は毎回変わりますが、決して正確ではありません)。
ケース3:
char stack3[6] = "stack";
printf("WORD %s\n", stack3);
printf("Length %d\n", stringLength(stack3));
プリント:
WORD stack
Length 5
ケース4:
char stack4[6] = "stack";
stack4[5] = '\0';
printf("WORD %s\n", stack4);
printf("Length %d\n", stringLength(stack4));
プリント:
WORD stack
Length 5
ケース5:
char * stack5 = malloc(sizeof(char) * 5);
if (stack5 != NULL) {
stack5[0] = 's';
stack5[1] = 't';
stack5[2] = 'a';
stack5[3] = 'c';
stack5[4] = 'k';
printf("WORD %s\n", stack5);
printf("Length %d\n", stringLength(stack5));
}
free(stack5);
プリント:
WORD stack
Length 5
ケース6:
char * stack6 = malloc(sizeof(char) * 6);
if (stack6 != NULL) {
stack6[0] = 's';
stack6[1] = 't';
stack6[2] = 'a';
stack6[3] = 'c';
stack6[4] = 'k';
stack6[5] = '\0';
printf("WORD %s\n", stack6);
printf("Length %d\n", stringLength(stack6));
}
free(stack6);
プリント:
WORD stack
Length 5
つまり、私は例との違いを知りたいのですが1、2、3、4(また、なぜeケース2のrraticな振る舞いで、1と3にヌル終端文字を指定する必要はありません。また、3と4の両方が同じ働きをしていますか?)また、5と6が十分なメモリが割り当てられていなくても(空白文字の各文字に5文字のスロットしか割り当てられていないので、どのように '\ 0'文字、つまり6番目の文字が検出されますか)
大変申し訳ありませんこの途方も長い質問のために、それはちょうど私がどこか他の
非常に広く文字列が配列に格納されている場合は、文字列の終わりを知る方法が必要です。 2つの最も明白な方法は、(1)別個の文字カウントを保持すること、または(2)ある文字(例えば '\ 0')で文字列を終了することです。オプション2は今日もっとも一般的な方法であると思われ、Cは文字列定数を ''\ 0' 'で自動的に終了します。標準のCライブラリは、 ''\ 0' 'で終了する文字列もexpcetします。 –
@TomKarzes: "* Cは文字列定数を '\ 0' *" "文字列 - *リテラル*で自動的に終了します。 – alk
試練とエラーでCを習得しようとしないでください。うつ病を引き起こすことが知られています。 – alk