【问题标题】:Explanation of finding length of a string in c++c++中查找字符串长度的解释
【发布时间】:2021-03-11 11:11:17
【问题描述】:

//c++解释中求字符串长度的程序?

int main() {
    char name[] = "computer applications";
    char *cptr = name;
    while(*cptr != '\0') {
        cptr++;
    }
    cout << "length = " << cptr - name << endl;
    return 0;
}

【问题讨论】:

  • 你有什么问题? (不是你必须提供解释吗?......假设这是家庭作业。)
  • 如果我能回答我为什么发布这个问题。我很困惑 cptr - name 是如何给出长度的
  • 这是一个非常基本的东西,在 C++ 的每一个(严肃的)介绍中都应该提到......

标签: c++ pointers strlen


【解决方案1】:

字符串是由零终止字符'\0' 终止的字符序列。

例如,如果您将使用字符串文字“Hello”初始化一个字符数组,例如

char s[] = "Hello";

那么这个声明就等价于

char s[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

所以字符串的长度计算为字符数,直到遇到终止零字符。当遇到它意味着表达式*cptr 包含字符并且循环中断它的迭代。这两个指针cptr - name之间的差异给出了字符串的长度。

根据 C++ 标准(C++14、5.7 加法运算符)

5 当两个指向同一个数组对象的元素的指针是 相减,结果为两者下标之差 数组元素。结果的类型是实现定义的 有符号整数类型;此类型应与定义的类型相同 作为标头(18.2)中的 std::ptrdiff_t 。与任何其他 算术溢出,如果结果不适合提供的空间, 行为未定义。 换句话说,如果表达式 P 和 Q 分别指向数组的第 i 个和第 j 个元素 对象,表达式 (P)-(Q) 的值为 i - j 提供的值 适合 std::ptrdiff_t 类型的对象。 此外,如果 表达式 P 指向数组对象的一个​​元素或一个 经过数组对象的最后一个元素,表达式 Q 指向 到同一数组对象的最后一个元素,表达式 ((Q)+1)-(P) 与 ((Q)-(P))+1 和 -((P)-((Q)+1)) 具有相同的值, 如果表达式 P 指向最后一个,则值为 0 数组对象的元素,即使表达式 (Q)+1 没有 指向数组对象的一个​​元素。除非两个指针都指向 相同数组对象的元素,或超过 数组对象,行为未定义。

【讨论】:

  • 或许值得一提的是s是一个静态大小的数组,std::size(s)can be used in this particular example
  • 我想知道 cptr - name 如何给出长度整数。这种差异如何发挥作用。
  • @KavirajPandey 根据指针算法,指向同一数组元素的两个指针的差异结果是这两个指针之间的数组元素数。查看我更新的帖子。
猜你喜欢
  • 2022-06-23
  • 2017-06-13
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多