我正在研究strlen()C中的函数,我看到了一个函数,这个函数返回了diffirent值.如果数组容量已满,则返回错误的结果.如果数组的容量未满,则返回true结果.我问的是什么原因?
非常感谢所有读者.
那就是功能
int myStrlen(char *s)
{
char *start;
start = s;
while (*s != 0)
{
++s;
}
return s - start;
}
Run Code Online (Sandbox Code Playgroud)
和主要的
int main()
{
char x[4] = "What";
printf("%d\n", myStrlen(x));
return 0;
}//Output: 21
Run Code Online (Sandbox Code Playgroud)
其他主要的
int main()
{
char x[5] = "What";
printf("%d\n", myStrlen(x));
return 0;
}//Output: 4
Run Code Online (Sandbox Code Playgroud)
由于尾随空字节,字符串"What"的类型char[5].定义用char[4]截断字符串并削减空字节.
由于在这种情况下缺少null终止符,因此myStrlen调用未定义的行为.
只是用
char str[] = "What";
Run Code Online (Sandbox Code Playgroud)
在实际代码中没有任何明确的数组长度.
而且,正如@Olaf在对你的问题的评论中所说:C没有方法而是功能!
方法在C++中可用,它们是虚函数的别名,在Java中(我没有任何线索).
Stroustroup先生在他的"C++编程语言第 4 版" 一书中介绍了C++中的方法,第20.3.2章:
虚拟成员函数有时称为方法.
有了这个功能
int main()
{
char x[4] = "What";
printf("%d\n", myStrlen(x));
return 0;
}//Output: 21
Run Code Online (Sandbox Code Playgroud)
中没有空终结符x.所以它未定义为myStrlen()循环,寻找null终止符,任何结果都是可能的.
赋值本身是有效的,并且字符串文字的前四个字节"What"被复制到x.但是该数组x不能用作C字符串.