,通過你自己也承認包含終止您的字符數組的使用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拉貝指出,要不鬆散的優化和像strlen
一個嘗試「N測試功能的安全性,這可能是一個更好的版本的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
}
向我們展示你的代碼 – Chinna
AC串只有一個'\ 0',這是在其結束。包含任何值的char數組不是一個字符串,''函數不能用於它。 –
mouviciel
請不要在C中使用'memmem()'的返回值。 – unwind