簡體   English   中英

檢查非空終止字符串的有效性

[英]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)或使用strcmpstrcpystrlen等函數,則無效。 確實,字符串只是一個帶有空終止符的字符數組,但是如果要考慮字符串,則需要使用空終止符。 因此,如果您不確定實際上是否有一個空終止的字符數組,則需要檢查空終止符。

這種區別非常重要,但是相似之處可以用於您的優勢,特別是當您進入嵌入式編程並通過線路恢復字符時。 我們只是說你有一個緩沖區,你將復活的字符放入,你正在尋找字符串“邁克”。 您很可能不會通過電線接收空終止符,因此當您搜索字符串時,您需要單獨比較字符或使用strncmp ,它只比較您告訴它的字符數,如果您有硬編碼字符串,您可以使用strlen來獲取用於strncmp字符串的大小。

暫無
暫無

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

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