簡體   English   中英

為什么我們需要在C中的字符數組末尾添加一個'\0'(null)?

[英]Why do we need to add a '\0' (null) at the end of a character array in C?

為什么我們需要在C中的字符數組末尾添加一個'\0'(null)? 我在 K&R 2(1.9 字符數組)中讀過它。 書中求最長字符串的代碼如下:

#include <stdio.h>
#define MAXLINE 1000
int readline(char line[], int maxline);
void copy(char to[], char from[]);

main() {
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];
    max = 0;
    while ((len = readline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);
    return 0;
}

int readline(char s[],int lim) {
    int c, i;
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0'; //WHY DO WE DO THIS???
    return i;
}

void copy(char to[], char from[]) {
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

我的問題是為什么我們將字符數組的最后一個元素設置為'\0'? 沒有它,程序也能正常工作……請幫幫我……

您需要使用'\\0'結束C字符串,因為這是庫知道字符串結束的位置(在您的情況下,這是copy()函數所期望的)。

沒有它,該程序工作正常......

沒有它,您的程序具有未定義的行為 如果程序碰巧做了你期望它做的事情,你就是幸運的(或者說,不幸的是,因為在現實世界中未定義的行為將選擇在最不方便的情況下表現出來)。

特別是字符串指針指向沒有長度已知的字符數組是NULL終止符將確定字符串長度的唯一方法。

關於鏈接上的 NULL終止的討論很棒

在c“string”中表示以null結尾的字符數組。 將其與pascal字符串進行比較,這意味着最多255個字符,前面是一個字節,表示字符串的長度(但不需要終止)。

每個appraoch都有它的優點和缺點。

因為C將字符串定義為由第一個空字符終止並包括第一個空字符的連續字符序列

基本上,C的作者可以選擇將字符串定義為字符序列+字符串的長度,或者使用魔術標記來分隔字符串的結尾。

有關該主題的更多信息,我建議您閱讀本文:

Poul-Henning Kamp 撰寫的 “最昂貴的單字節錯誤” http://queue.acm.org/detail.cfm?id=2010365

你實際上已經在這里自己寫了答案:

void copy(char to[], char from[]) {
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

在這個函數中的循環將繼續,直到它該陣列中遇到“\\ 0”。 如果沒有終止零,則循環將繼續執行未知數量的步驟,直到遇到零或無效的存儲區域。

真的,你不需要通過\\ 0結束的字符數組。 它是char *,或者需要由它結束的字符串的C表示。

對於數組,如果要將其傳遞給字符串(由char *表示,則必須在結束添加\\ 0)。

另一方面,如果要將其作為char *進行處理並計划在其上使用char *函數,則需要在數組末尾使用\\ 0。

數組中的'\\0'表示字符串的結尾,這意味着該字符后面的任何字符都不被視為字符串的一部分。這並不意味着它們不是字符數組的一部分。 也就是說,我們仍然可以通過索引來訪問這些字符,但是當我們向這個字符數組調用與字符串相關的東西時它們就不合適了。

要使字符串格式正確並且能夠與字符串函數一起正常工作,它必須是以null結尾的字符數組。 如果沒有NULL,當我們在字符數組上調用字符串函數時,程序會顯示未定義的行為。 盡管我們大多數時候都可能對結果感到幸運,但它仍然是一種未定義的行為。

我剛剛查了一下如果你的數組被認為是字符串這意味着像這樣的char array[MAX]="string"; 或者像這樣scanf("%s",array); 或者char* table; 然后 NULL 字符'\0'將自動作為該表上字符的末尾 append 但是如果你像這樣初始化它char array[MAX]={'n','o','t','s','t,'r'}; 或者您使用%c格式逐個字符地填充它

for(int i=0;i<MAX;i++)
   scanf("%c",&array[i]);

或者getchar()而不是scanf("%c",...)然后你必須自己添加'\0'因為現在它被認為是任何其他數組的類型 (int,float...) 所以我們的情況考慮為空實際上由隨機數或字符填充取決於類型同時在字符串類型的情況下,最后一個考慮的字符之后的下一個字符默認為'\0'以獲得更多解釋這個char array[]="12345"是 6 array[5]=='\0'將返回 1 換句話說你不能像這樣定義一個字符串數組char array[3]="123"因為我們沒有為'\0'必須自動最后一個例子 append char array[7]={'t','e','s','t','\0'}; 這里array[4]是NULL字符array[5]和array[6]是隨機值但是如果是string那么"test"array[4]和5和6都是由NULL字符填充的(NULL字符可以參考到我認為的任何 white_space 選項卡'\t'並輸入'\n'也是 NULL 個字符,就像'\0'可能指的是空格鍵)注意本:我們不能分配數組 [7] 或更多,因為我們都知道但是如果你嘗試 output 它,它會顯示一個隨機值作為任何空的情況

它是字符串終止符號,當遇到這種情況時,編譯器會知道你的字符串已經結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM