【问题标题】:Strlen returns unreasonable numberstrlen 返回不合理的数字
【发布时间】:2012-06-27 08:53:52
【问题描述】:

如果我写:

char  lili [3];
cout<<strlen(lili)<<endl;

那么打印出来的是:11

但如果我写:

char  lili [3];
lili [3]='\0';
cout<<strlen(lili)<<endl;

然后我得到 3。

我不明白为什么它在第一部分返回 11?
strlen 不应该返回 3,因为我为 lili 分配了 3 个字符?

【问题讨论】:

  • 垃圾进,垃圾出。正如答案所解释的,如果您将不合理的输入传递给函数,您可能会得到不合理的输出。

标签: c++ strlen


【解决方案1】:

这是因为strlen 使用“C 风格”以空字符结尾的字符串。如果您像在第一个示例中那样给它一个普通指针或未初始化的缓冲区,它将继续在内存中前进,直到它 a) 找到 \0,此时它将返回该“字符串”的长度,或者 b ) 直到它到达受保护的内存位置并产生错误。

鉴于您已标记此 C++,也许您应该考虑使用 std::array 或更好的 std::string。两者都提供长度返回函数 (size()),并且都具有一些额外的范围检查逻辑,这将有助于防止您的代码像您在这里所做的那样徘徊到未初始化的内存区域。

【讨论】:

    【解决方案2】:

    strlen 函数搜索设置为\0 的字节。如果在未初始化的数组上运行它,则行为未定义。

    【讨论】:

      【解决方案3】:

      你必须先初始化你的数组。否则里面有随机数据。

      strlen 正在寻找一个字符串终止符号,并且会一直计数直到找到它。

      【讨论】:

        【解决方案4】:

        strlen 计算字符数,直到它达到'\0'(表示“字符串结尾”)。 在 C 和 C++ 中,char[] 等价于 char *,strlen 使用lili 作为指向 char 的指针并迭代它指向的内存,直到它到达终止的 '\0'。碰巧内存中有 0 个字节,而为您的数组分配的内存中有 11 个字节。你可能会得到更奇怪的结果。

        其实,当你写 lili[3] = '\0' 您访问阵列外的内存。 C/C++ 中三元素数组的有效索引为 0-2。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多