[英]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 終止符不是自動的(除非文檔說明函數調用為您編寫了 NUL 終止符)。
在您的情況下,請使用:
s[20] = 0;
如評論中所述, C 字符串由終止符 NUL 字符定義。 所有strXXX
C 函數也需要 NUL 字符。
如果您沒有用 NUL 標記字符串的結尾,則您有一個(二進制)字符序列,但不是 C 字符串。 這些有時稱為二進制字符串,它們不能使用strXXX
庫函數。
您很可能主要是偶然獲得正確的結果。
對正確結果最可能的解釋是,您使用的操作系統為您提供了“干凈”的內存堆棧(初始堆棧內存全為零)……情況並非總是如此。
由於您在執行代碼之前從未在堆棧內存上寫過內容,因此以下字節是之前存在的任何內容(在您的操作系統上,該字節在首次初始化堆棧時設置為零)。
但是,如果操作系統沒有為您提供“干凈”的堆棧,或者您的代碼在以前使用的堆棧上運行,則情況並非如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.