为什么功能根据容量返回不同的值

时间:2016-01-09 20:22:24

标签: c string

我正在研究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

3 个答案:

答案 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中没有空终结符。所以它是undefinedmyStrlen()遍历它,寻找空终止符,任何结果都是可能的。

赋值本身有效,字符串文字"What"的前四个字节被复制到x。但是数组x不能用作C字符串。

答案 2 :(得分:2)

在C(和C ++)中,字符串以二进制0或' \ 0'终止。你的声明太短了,所以你制作了一个未终止的字符串,这将导致各种错误和崩溃,具体取决于你用它做什么。

第一个效果是strlen函数通过该字符串后面的内存继续计数,直到它碰巧找到0;这可能是在21,在134,或以崩溃结束 - 你是非法侵入不属于程序的记忆,迟早会产生问题。

您需要将该字符串声明为[5],以便为终止' \ 0'提供空间。