簡體   English   中英

使用C中包含多個Null字符的字符串

[英]Working with strings in C that contain multiple Null characters

我有一個char[]緩沖區,其中包含從內存中讀取的數據,這意味着此緩沖區中有多個Null,而不只是一個終止的Null。

char *addr = (char *)memmem(buff, strlen(buff), needle, strlen(needle));

我需要處理此字符串並搜索並替換某些內容。 為此,我想使用memmem() ,但不幸的是,它不起作用,因為緩沖區內有多個Null。

我試圖用一個我認為不會出現的字符(Bell ASCII代碼\\ 7)替換緩沖區中的Null然后處理它,但這不起作用並破壞我的數據。

是否有另一種方法來處理具有多個Null的字符串?

memmem可以用來做它。 但是,由於您的數據包含嵌入的空值,因此無法使用strlen來計算長度。 您需要分別跟蹤長度。

char *addr = (char *)memmem(buff, buffLen, needle, needleLen);

在你的char數組上使用strlen ,你自己承認包含終止是行不通的。 您應該意識到strlen只計算字符數,直到它遇到零終止符。
順便說一句,這也是strncat工作原理,所以你也不能使用這些功能。

你可以做的是保留一個用於跟蹤字符串實際長度的int
解決這個問題的另一種方法是編寫自己的d_strlen函數,並始終確保緩沖區末尾有兩個零終止字符:

size_t d_strlen(const char *in)
{
    size_t len = 0;
    while( !(in[len] == '\0' && in[len+1] == '\0' )) ++len;
    return len;
}

再次:你的buffer 必須兩個終止零終止,而不僅僅是一個:

char buff[100] = "this \0 string contains \0 terminators \0";//adds second \0
printf("%d  != %d\n", strlen(buff), d_strlen(buff));//yields 5 != 37

正如Frerich Raabe指出的那樣,為了不放棄strlen這樣經過試驗的測試函數的優化和安全性,這可能是d_strlen的更好版本

size_t d_strlen(const char *in)
{
    size_t len = 0;
    while(strlen(in+len)) len += strlen(in+len) + 1;
    return len ? --len : 0;//check for zero-length
}

但是,這會調用strlen兩次,這是無意義的開銷,所以你最好寫這個:

size_t d_strlen(const char *in)
{
    size_t i, len = 0;
    do
    {
        i = strlen(in+len);//get substring length
        len += i + 1;//add to total length + 1 for \0 char
    }while(i > 0);
    return len > 1 ? len-2 : 0;//subtract 2, if possible, else return 0
}

AC字符串是由NUL終止的字符序列...根據定義,它不能包含多個NUL。 你擁有的是更通用的東西,一塊字符。 為了處理任意的字符塊,它們必須伴隨一個長度 - 字符數的計數。 鑒於您可以處理塊而不關心它是否包含NUL。 給定一個由指向某些字符和計數的指針組成的塊,你可以使用count而不是strlen

memmem(buff, buff_len, needle, needle_len);

暫無
暫無

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

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