为什么strlen()也适用于字符数组?

时间:2015-03-09 17:59:37

标签: c++ arrays function

strlen()是一个函数参数应该是一个字符串,但为什么它也适用于字符数组? 例如

char abc[100];   
cin.getline(abc,100);  
len=strlen(abc);  

如果它适用于字符数组并且告诉元素的数量,它是否也可以用于int数组?

注意:我使用的是TurboC ++

3 个答案:

答案 0 :(得分:6)

了解字符串是什么非常重要。 C标准将字符串定义为&#34;由第一个空字符&#34;终止并包括的连续字符序列。它是数据格式,而不是数据类型; C样式的字符串可以包含在char的数组中。不要将其与std::string(注意:没有<string>后缀)标题中定义的特定于C ++的类型.h混淆。

<string.h>标头,或最好是<cstring>标头,从C标准库合并到C ++中。在该标头中声明的函数在C风格的字符串或指向它们的指针上运行。

strlen的参数是char*类型,是指向字符的指针。 (它实际上是const char*,这意味着strlen承诺不会修改它所指向的内容。)

在大多数情况下,数组表达式隐式转换为指向数组初始元素的指针。 (有关详细信息,请参阅comp.lang.c FAQ的第6节。)

传递给char* strlen参数必须指向字符数组的初始元素,并且必须有一个空字符({{1} })数组中的某个位置标记字符串的结尾。它计算最多但不包括空终止符的字符数。

它不会(也不能)计算数组中元素的数量,只计算字符串中的字符数 - 只有当数组实际包含有效字符串时才能这样做。如果数组中的任何位置都没有空字符,或者指针为空或无效,则行为未定义。

所以当你写:

'\0'

char abc[100]; cin.getline(abc,100); len=strlen(abc); 的调用可确保数组cin.getline包含正确的以空字符结尾的字符串。 abc调用strlen(abc),将初始字符的地址传递给它;它相当于strlen

不,strlen(&abc[0])不适用于strlen数组。首先,这将传递int值,该值与int*所需的char*不匹配,因此它可能无法编译。即使忽略这一点,strlen也会对字符进行计数,而不是strlen。 (如果你愿意,你可以编写自己类似的函数来计算int s,但它仍然需要有一些方法来找到你有兴趣计算的元素的结尾。它没有&#39;除非你明确地传递它,否则可以访问数组的实际长度。)

答案 1 :(得分:4)

strlen仅适用于以null结尾的字符数组。

如果字符串 1 的末尾没有空字符,则调用strlen会导致未定义的行为。

std::cin.getline会自动在结尾附加空字符,这就是您strlen工作的原因。

1(不一定与数组末尾相同)

答案 2 :(得分:1)

在C字符串中是char的数组。所有strlen都会计算项目数,直到找到0(或空字符)