我正在研究C中的strlen()
函数,我看到了一个函数,这个函数返回了diffirent值。如果数组容量已满,则返回错误的结果。如果数组的容量未满,则返回true结果。
我问的是什么原因?
非常感谢所有读者。
这是功能
int myStrlen(char *s)
{
char *start;
start = s;
while (*s != 0)
{
++s;
}
return s - start;
}
和主要
int main()
{
char x[4] = "What";
printf("%d\n", myStrlen(x));
return 0;
}//Output: 21
其他主要
int main()
{
char x[5] = "What";
printf("%d\n", myStrlen(x));
return 0;
}//Output: 4
答案 0 :(得分:6)
由于尾随空字节,字符串"What"
的类型为char[5]
。使用char[4]
的定义会截断字符串并删除空字节。
由于在这种情况下缺少空终止符,myStrlen
将调用未定义的行为。
只需使用
char str[] = "What";
在实际代码中没有任何明确的数组长度。
正如@Olaf在对你的问题的评论中所说: C没有方法,但功能!
方法在C ++中可用,它们是虚函数的别名,在Java中(我没有任何线索)。
Stroustroup先生在他的“C ++编程语言4 th Edition”一书中对C ++中的方法进行了以下讨论,第20.3.2节:
虚拟成员函数有时称为方法。
答案 1 :(得分:5)
使用此功能
int main()
{
char x[4] = "What";
printf("%d\n", myStrlen(x));
return 0;
}//Output: 21
x
中没有空终结符。所以它是undefined,myStrlen()
遍历它,寻找空终止符,任何结果都是可能的。
赋值本身有效,字符串文字"What"
的前四个字节被复制到x
。但是数组x
不能用作C字符串。
答案 2 :(得分:2)
在C(和C ++)中,字符串以二进制0或' \ 0'终止。你的声明太短了,所以你制作了一个未终止的字符串,这将导致各种错误和崩溃,具体取决于你用它做什么。
第一个效果是strlen函数通过该字符串后面的内存继续计数,直到它碰巧找到0;这可能是在21,在134,或以崩溃结束 - 你是非法侵入不属于程序的记忆,迟早会产生问题。
您需要将该字符串声明为[5],以便为终止' \ 0'提供空间。