2016-11-26 80 views
3

所以我剛剛讀了一個如何創建表示字符串的字符數組的示例。何時/爲什麼' 0'需要標記(char)數組的結尾?

空字符\0在陣列的端部被放置到標記數組的末尾。這是必要的嗎?

如果我創建了一個字符數組:

char line[100]; 

,並把這個詞:

"hello\n" 

,該字符將被置於前六個指標line[0] - line[6],所以剩下的數組將填充空字符嗎?

這本書說,它是一個約定,例如字符串常量"hello\n"被放入字符數組中並以\0終止。

也許我完全不理解這個話題,並且會爲啓蒙感到高興。

+1

\ 0用於標記C中字符串的結尾。大多數C std庫函數都需要以此方式終止字符串才能工作。 – Outshined

+0

由於C不知道你的字符串有多長,你必須用\ 0標記結尾,以便知道它已經到達字符串的末尾。 –

+0

你也可以在C中使用Pascal字符串。當然,現有的功能不會期望這樣他們不會一起工作。 – harold

回答

1

何時/爲什麼'\ 0'需要標記(char)數組的結尾?

如果字符數組包含字符串,則終止零是必需的。這允許找到一個字符串結束的地方。

至於你的例子,因爲我覺得看起來下列方式

char line[100] = "hello\n"; 

那麼對於初學者字符串文字具有7字符。它是一個字符串幷包含終止零。該字符串文字的類型爲char[7]。你可以把它想象喜歡

char no_name[] = { 'h', 'e', 'l', 'l', '\n', '\0' }; 

當一個字符串文字是用來初始化字符數組那麼它的所有字符都用作初始化值。因此,相對於該示例,字符串文字的七個字符用於初始化數組的前7個元素。數組中所有未被字符串字符初始化的其他元素將被零隱式地初始化。

如果要確定存儲在字符數組中的字符串有多長,可以使用標頭<string.h>中聲明的標準C函數strlen。它返回終止零之前數組中的字符數。

考慮下面的例子

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char line[100] = "hello\n"; 

    printf("The size pf the array is %zu" 
      "\nand the length of the stored string \n%s is %zu\n", 
      sizeof(line), line, strlen(line)); 

    return 0; 
} 

它的輸出是

The size pf the array is 100 
and the length of the stored string 
hello 
is 6 

在C你可以使用一個字符串來初始化一個字符數組不包括字符串常量的終止零。例如

char line[6] = "hello\n"; 

在這種情況下,你可能不說,數組包含字符串,因爲存儲在陣列中的符號序列不具有終止零。

1

如果您將它用作字符數組,則不需要'\ 0'。但是如果你使用字符數組作爲字符串,你需要把'\ 0'。 C中沒有單獨的字符串類型。

有多種方式可以聲明字符數組。

例:

char str1[] = "my string"; 
char str2[64] = "my string"; 
char str3[] = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'}; 
char str4[64] = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'}; 

所有這些陣列具有相同的字符串 「我的字符串」。在str1和str3中,'\ 0'字符會自動添加,但在另外兩個字符中,您需要明確添加。

6

\0字符不標記「數組的末尾」。所述\0字符標誌着存儲在字符數組,如果(且僅當),該字符數組被用於存儲一個字符串的末尾。

char數組只是一個char數組。它存儲獨立的整數值(char只是一個小整數類型)。字符數組不必以\0結束。在char數組中,\0沒有特殊含義。這只是一個零值。

但有時字符數組用於存儲字符串。字符串是由\0終止的一系列字符。所以,如果你想用你的char數組作爲字符串你必須用\0來終止你的字符串。

所以,這個問題的答案約\0是「必要的」依賴於你所存儲在您的字符數組。如果您要存儲字符串,那麼您將不得不用\0來終止它。如果你存儲的不是字符串,那麼\0根本就沒有特別的意義。

1

您需要空字符來標記字符串的末尾。C不存儲任何關於字符數組長度或字符串長度的內部信息,所以空字符/字節\0表示它結束的位置。

這只是字符串必需的,但是 - 您可以擁有任何不代表字符串的普通字符數組。

例如,嘗試這段代碼:

#include <stdio.h> 

int main(void) { 
    char string[1]; 
    string[0] = 'a'; 
    printf("%s", string); 
} 

注意,字符數組被完全填滿數據。因此,沒有空字節標記結束。現在,printf將繼續打印,直到它遇到空字節 - 這將會在數組的末尾,因此除了「a」之外,還會打印出大量垃圾。

現在試試這個:

#include <stdio.h> 

int main(void) { 
    char string[2]; 
    string[0] = 'a'; 
    string[1] = '\0'; 
    printf("%s", string); 
} 

這將只打印「一」,因爲字符串的結尾明確標記。

1

通過搜索(第一個)NUL字節可以找到C字符串(包含字符並以'\ 0'字符結尾的數組)的長度。 \ 0是零字符。在C中,它主要用於指示字符串的終止。 我打一個比方你:

讓我們說你寫一個字到一個文件:

word = malloc(sizeof(cahr) * 6); 
word = "Hello"; 
fwrite(word, sizeof(char), 6, fp); 

word,我們爲「你好」的5個字符分配空間,加上一個更以其終止'\ 0'。 fp是該文件。 的現在,我們寫一個字的最後一個後:

word2 = malloc(sizeof(cahr) * 7); 
word2 = "world!"; 
fwrite(word2, sizeof(char), 7, fp); 

所以,現在,讓我們看兩個詞:

char buff = malloc(sizeof(char)*1000); // See that we can store as much space as we want, it won't change the final result 
/* 13 = (5 chacater from 'Hello')+(1 character of the \0)+(6 characters from 'world!')+(1 character from the \0) */ 
fread(buff, sizeof(char), 13, fp); // We read the words 'Hello\0' and 'world!\0' 
printf("the content of buff is: %s", buff); // This would print 'Hello world!' 

最後這是由於結束\0角色,所以Ç知道有兩個分離的字符串存入緩衝區。如果我們沒有在這兩個單詞的末尾加上那個\0字符,並重復相同的示例,則輸出將是"Helloworld!" 這可用於許多字符串方法和函數!

相關問題