,通过你自己也承认包含终止您的字符数组的使用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