我對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的規則行爲,並且不需要在1和3中指定空終止字符。另外,3和4的工作方式是否相同?)以及5和6如何分配相同的內容,即使分配的內存不足情況5爲空終止字符(因爲只有5個字符分配給每個字母在「鬆弛」中,它是如何檢測'\ 0'字符的,即第6個字符?)
我很抱歉這個荒謬長的問題,它只是我找不到這些具體事例還有
非常廣泛的,如果你有一個字符串存儲在一個數組中,那麼你必須知道字符串結束的位置。兩個最明顯的方法是(1)保留單獨的字符數,或(2)用一些唯一字符(例如''\ 0'')終止字符串。選項2似乎是今天最常用的方法,C自動終止帶有''\ 0'的字符串常量。標準的C庫也會顯示''\ 0''終止的字符串。 –
@TomKarzes:「* C自動終止字符串常量'\ 0'*」好吧,只是字符串* *文字*。 – alk
不要試圖通過Trial&Error學習C,因爲這已知會導致蕭條。 – alk