2016-01-09 79 views
0

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

C不支持_methods_,只有_functions_。 – Olaf

+2

并使用调试器来查看会发生什么。提示:你的第一个'main'调用未定义的行为。 – Olaf

+3

如果你的char缓冲区只有4个字符的空间,那么空字符在哪里?你已经填满了它。 –

回答

5

有了这个功能

int main() 
{ 
    char x[4] = "What"; 
    printf("%d\n", myStrlen(x)); 
    return 0; 

}//Output: 21 

有没有空终结者x。所以它是undefined作为myStrlen()循环它寻找空终止符和任何结果是可能的。

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

+0

非常感谢。你的链接和解释对我很有帮助。@ l3x – ZpCikTi

+0

很高兴帮助。一般来说,如果你正在*拷贝*(就像在你的代码中)一个字符串字面值,那么最好不*明确指定大小,比如'char str [] =“Hello”;'。在这里,编译器会为'str'分配必要的大小,如果您决定更改字符串文字,则不需要担心。如果你有'char s [5] =“what”;'那么它的大小是正确的。但后来,如果将字符串文字更改为'“What?”',那么您还必须更改长度(这通常会被忽略并导致问题)。通过不指定尺寸,更容易避免这种错误。 –

6

字符串"What"char[5]类型的由于结尾的空字节。使用char[4]的定义会截断字符串并删除空字节。

由于在这种情况下空终止符丢失,myStrlen调用未定义的行为。

只需使用

char str[] = "What"; 

没有真正的代码,任何显式数组长度。


而且,随着@Olaf在你的问题中留言说:C没有方法,但功能
方法在C++中是可用的,它们是虚函数的别名,在Java中(我对此没有线索)。

Stroustroup先生说上++在他的著作“C++编程语言4 版,”第20.3.2用C方法如下:

虚成员函数有时也被称为一个方法。

+0

将所有成员函数称为面向对象语言的方法是很常见的,C++是一个例外。然后用虚拟方法和静态方法重申这一点。我不认为指出这些差异是非常明智的,因为没有跨语言的标准术语,只有某些社区对相同的概念使用不同的名称。如果您习惯于一种语言社区的命名并进入另一种语言社区,那么这会变得非常混乱...... –

+0

@ZdeněkJelínek每种语言都有不同的术语。 C中的字符串在其他OO语言中完全不同(希望可以作为类比)。与Java函数相反,C++函数是不同的。在C++中使用术语“方法”是误导性的,因为它是一个**虚拟**成员函数,并且我们可以称之为约定(不是标准的,而是惯例)。我对初学者的建议是:学习术语,遵守约定,并牢记C++与Java本质上和大量的不同。 – Downvoter

+0

我喜欢你做的比较。我实际上认为,无论何时你说“string”,每个人都有一个关于你在说什么的想法,无论是程序集,C,C++,Java,...程序员,还是DBA。即使只涉及面向对象的社区,我也怀疑你可以对“成员函数”说同样的话。然而,我同意这样一个事实,即一个人应该使用适当的术语作为调用'功能','方法'是完全关闭的。 –

2

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

第一个影响是strlen函数继续通过该字符串后面的内存进行计数,直到碰巧找到0;那可能是在21,在134,或以崩溃结束 - 你是不属于该程序的内存,迟早会产生问题。

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

+1

请勿混淆声明和定义。数组声明根本不需要大小说明符。 – Downvoter

相关问题