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

标签 c++ arrays function

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

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

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

注意:我使用的是 TurboC++

最佳答案

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

<string.h> header ,或者最好是 <cstring> header ,从 C 标准库合并到 C++ 中。在该 header 中声明的函数对 C 样式字符串或指向它们的指针进行操作。

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

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

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

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

所以当你写的时候:

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

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

不,strlen不适用于 int 的数组.一方面,这将通过 int*值,与 char* 不匹配那strlen需要,所以它可能不会编译。即使忽略这一点,strlen计算字符数,而不是 int秒。 (如果你愿意,你可以编写自己的类似函数来计算 int s,但它仍然必须有一些方法来找到你有兴趣计算的元素的结尾。它无法访问实际的数组的长度,除非您显式传递它。)

关于c++ - 为什么 strlen() 也适用于字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28948745/

相关文章:

javascript - 将 JavaScript 代码迁移到带有 String.prototype 扩展的 node.js 模块

c++ - 垃圾收集的想法

javascript - Jquery - 使用 HTML :selected to fetch an array with the same name

c++ - 如何将字符串数组的值分配给 "Name"+ #,例如。名称 1、名称 2、名称 3 等。C++

c - IF 语句正在更改函数中的数组元素

定义函数闭包的 Pythonic 方式

C++ priority_queue 自定义比较器和删除任何项目

c++ - 从名称在字符串上的整数获取值

c++ - 我怎样才能得到除法除零以外的结果

arrays - 返回可能重复的数组元素的所有唯一排列