[英]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.