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

eat*_*atq 3 c++ arrays function

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

char abc[100];   
cin.getline(abc,100);  
len=strlen(abc);  
Run Code Online (Sandbox Code Playgroud)

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

注意:我使用的是TurboC++

Kei*_*son 6

了解字符串是什么很重要.C标准将字符串定义为"由第一个空字符终止并包括第一个空字符的连续字符序列".它是一种数据格式,而不是数据类型 ; 一个C风格的字符串可能包含在一个数组中char.不要将其与(注意:无后缀)标头中std::string定义的特定于C++的类型混淆.<string>.h

<string.h>报头,或优选地,所述<cstring>报头中,从C标准库并入C++.在该标头中声明的函数在C风格的字符串或指向它们的指针上运行.

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

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

char*传递给的参数strlen 必须指向字符数组的初始元素,并且数组中的'\0'某处必须有一个空字符()来标记字符串的结尾.它计算最多但不包括空终止符的字符数.

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

所以当你写:

char abc[100];
cin.getline(abc,100);
len=strlen(abc);
Run Code Online (Sandbox Code Playgroud)

调用以cin.getline确保数组abc包含正确的以null结尾的字符串.strlen(abc)调用strlen,传递初始字符的地址; 它相当于strlen(&abc[0]).

不,strlen不会在数组上工作int.一方面,这将传递一个int*值,这不符合char*strlen要求,因此它可能不会编译.即使忽略这一点,strlen也要算字符,而不是ints.(int如果你愿意,你可以编写自己类似的函数来计算s,但它仍然必须有一些方法来找到你有兴趣计算的元素的结尾.它无法访问实际的长度.数组除非你明确地传递它.)

  • @eatq:换句话说,我在这里度过的时间越多,我写短评就越糟糕.8-)} (4认同)