[英]Comparing null-terminated string with a non null-terminated string in C
[英]Checking validity of non null-terminated string
我無法繞着null終止符和非null終止數組包裹我的大腦。
假設我有兩個聲明:
const char *string = "mike";
和
const char string[4] = {'m', 'i', 'k', 'e'};
我理解第一個聲明是因為在C中,字符數組是空終止的,因為它被定義為內存中以NULL結尾的連續字符塊,我可以用strlen
來檢查它。
我遇到的問題是理解第二個聲明,沒有空終止符。
如何檢查沒有空終止符的字符串的有效性? (如果在數組中有其他值,該怎么辦?)
你不能。 沒有null終止符的字符串不是字符串。 它只是一個字符數組。 AC字符串必須具有空終止符才能被視為字符串。
您必須像處理int[]
數組或任何其他類型的數組一樣處理它:如果它不是已知的固定大小,請分別跟蹤大小。 因為它不是字符串,所以你不能像strlen
那樣調用字符串函數。
如何檢查沒有空終止符的字符串的有效性?
您需要知道數組邊界,以查看邊界內是否包含以null結尾的字符串。 以下是您在示例中如何做到這一點:
const char string[4] = {'m', 'i', 'k', 'e'};
int good = 0;
for (int i = 0 ; i != sizeof(string) ; i++) {
if (string[i] == '\0') {
good = 1;
break;
}
}
if (good) {
printf("String '%s' is null-terminated.\n", string);
} else {
printf("String is not null-terminated; cannot print.\n");
}
盡管C庫僅支持以null結尾的字符串,但只要您可以訪問其大小(即它是數組,而不是指針),您就可以使用沒有空終止的字符數組。 例如,您可以像這樣打印數組:
printf("'%.*s'\n", sizeof(string), string);
字符串需要結束將是一個空終止符。 如果您嘗試在第二個示例上執行printf("%s",string)
或使用strcmp
, strcpy
或strlen
等函數,則無效。 確實,字符串只是一個帶有空終止符的字符數組,但是如果要考慮字符串,則需要使用空終止符。 因此,如果您不確定實際上是否有一個空終止的字符數組,則需要檢查空終止符。
這種區別非常重要,但是相似之處可以用於您的優勢,特別是當您進入嵌入式編程並通過線路恢復字符時。 我們只是說你有一個緩沖區,你將復活的字符放入,你正在尋找字符串“邁克”。 您很可能不會通過電線接收空終止符,因此當您搜索字符串時,您需要單獨比較字符或使用strncmp
,它只比較您告訴它的字符數,如果您有硬編碼字符串,您可以使用strlen
來獲取用於strncmp
字符串的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.