簡體   English   中英

字符串末尾的空字符 '\\0'

[英]A null character '\0' at the end of a string

我有以下代碼。

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

#define MAXLINE 1000

int main()
{
    int i;
    char s[MAXLINE];

    for (i = 0; i < 20; ++i) {
        s[i] = i + 'A';
        printf("%c", s[i]);
    }

    printf("\nstrlen = %d\n", strlen(s)); // strlen(s): 20
    return 0;
}

我應該寫嗎

s[i] = '\0';

在循環執行后顯式標記字符串的結尾還是自動完成? 沒有s[i] = '\\0'; 函數 strlen(s) 返回正確的值 20。

是的,您需要自己添加一個空終止符。 一個不是自動添加的。

您可以通過將s顯式初始化為在字節 20 處不包含 NUL s來驗證這一點。

char s[MAXLINE] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

如果你這樣做strlen(s)不會返回 20。

是的,您應該在循環后添加空終止符。 或者,您可以使用0初始化整個數組。 這樣,您不必在循環后添加0 ,因為已經有一個:

...
char s[MAXLINE] = {0};
...

您必須添加一個 NUL 終止符來標記 C 字符串的結尾。

添加 NUL 終止符不是自動的(除非文檔說明函數調用為您編寫了 NUL 終止符)。

在您的情況下,請使用:

s[20] = 0;

如評論中所述, C 字符串由終止符 NUL 字符定義 所有strXXX C 函數也需要 NUL 字符。

如果您沒有用 NUL 標記字符串的結尾,則您有一個(二進制)字符序列,但不是 C 字符串。 這些有時稱為二進制字符串,它們不能使用strXXX庫函數。

為什么你得到正確的結果

您很可能主要是偶然獲得正確的結果。

對正確結果最可能的解釋是,您使用的操作系統為您提供了“干凈”的內存堆棧(初始堆棧內存全為零)……情況並非總是如此

由於您在執行代碼之前從未在堆棧內存上寫過內容,因此以下字節是之前存在的任何內容(在您的操作系統上,該字節在首次初始化堆棧時設置為零)。

但是,如果操作系統沒有為您提供“干凈”的堆棧,或者您的代碼在以前使用的堆棧上運行,則情況並非如此。

暫無
暫無

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

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