【问题标题】:Function that will act like an Strlen C++类似于 Strlen C++ 的函数
【发布时间】:2011-02-03 19:30:11
【问题描述】:

我想创建一个与 Strlen 一样的函数,但我收到错误:“字符串下标超出范围”。我试过修复它,但不知道。

代码如下:

#include "stdafx.h"
#include "stdafx.h"
#include <string>
#include <sstream>
#include <iostream>


using namespace std;

int strlen1( string str)
{
    int count=0;
    int i=0;
    while (str[i]!='\0')
        {
            count++;
            i++;
    }
    return count;
}

int _tmain(int argc, _TCHAR* argv[])
{
    string input;
    cin >> input;
    cout << strlen1(input) << endl;

    return 0;
}

谢谢!

【问题讨论】:

  • c++ 字符串可以,但不必以空值结尾。
  • 为什么是count++; i++;?你只需要一个......但这不是问题......
  • 您看过 s​​td::string 文档吗? sgi.com/tech/stl/basic_string.html
  • int i; for(i=0; i&lt;str.size(); ++i) { } return i;
  • @PigBen: str = string(42, '\0');

标签: c++ strlen


【解决方案1】:

简而言之,对于非conststd::string访问超出字符串长度的元素具有未定义行为(更准确地说,当使用非const operator[] 时)。

C++98 §21.3.4/1,关于std::string::operator[]

如果pos &lt; size,则返回data()[pos]。否则,如果pos == size(),则const 版本返回charT()。否则行为未定义。

而且你的字符串不是const

您可以将其设为const,然后它将调用标准中的一个特殊规定,以保证元素 n 的结果为零,但这并不能解决您的函数完全冗余的问题std::string.

也许您的意思是参数类型为char const*

这样会更有意义,然后该功能也可以工作。

干杯,

【讨论】:

  • const 使它工作,但正如你所说,我认为正确的解决方案是使用参数类型 char* 而不是字符串。不幸的是,当我在 str 和输入变量中替换它时,它没有工作,说变量“输入”正在被使用而没有被初始化。我不知道如何让它工作
  • 只需将str 变量更改为const char *;将input 保留为string。然后将其称为strlen1(input.c_str())
  • 从来不知道。显然在 C++0x 中 s[s.size()] 将始终返回对 NUL 字符的引用(并且您不得修改该值)。
【解决方案2】:

您似乎误以为 std::string 与 C 样式字符串 (char const*) 相同。这是不正确的。没有空终止符。

这是你的 strlen 函数的唯一工作方式:

int strlen1(string str) { return static_cast<int>(str.size()); }

【讨论】:

  • 实际上有一个空终止符,只要你创建字符串const
  • 不知道为什么你会在这里说 constness 很重要。 Null 不被视为 std::string 的终止符。
  • 我做到了。返回 Null 是对的,但是在这里你称它为终止符是错误的。
  • @Noah Roberts: const 很重要,因为 strlen1 应该自豪地向世界宣布它不会破坏字符串以获得它的大小...... size() 方法原型 size_t size() const;
  • @kriss - 当然,但它不会神奇地使 0 成为 std::string 中的终止符。
【解决方案3】:

std::string 有一个很好的 size() 方法。

【讨论】:

  • 你确定你必须创建一个以 std::string 作为参数的 strlenb 函数,而不是 char* 吗?
  • 你说得对,我弄错了,需要它作为 char*。不幸的是,当我在 str 和输入变量中替换它时,它没有工作,说变量“输入”正在被使用而没有被初始化。我不知道如何让它工作
【解决方案4】:

strlen 基于以零结尾的字符串(char* 或 char 数组),C++ string 基于长度 + 数据,您无法在字符串结尾之后访问数据(此处为终端零)。除此之外,获取长度是 C++ 字符串的标准属性(size()),因此编写 strlen 的标准方法就是调用 size。

【讨论】:

  • 其实,对于一个constant std::string,长度为n,访问元素n(超出字符串长度)需要产生'\0'。这是标准中的特殊情况规定。因此,如果 OP 只是在形式参数类型中添加了一点 const,那么 strlen1 函数在技术上是可以的。
  • sero 终止字符串是什么意思?你觉得我怎么能自己创建一个 strlen 函数?
  • @Aviran:我的意思是创建一个基于 std::string 作为输入的 strlen 函数可能是我听说过的最愚蠢的事情之一。如果是一些家庭作业,您应该考虑寻找更好的老师。
  • @Alf P. Steinbach:技术上没问题,你这么说,有很多方法可以在没有 const 的情况下完成同样的事情。但我同意像 strlen 这样的函数,使参数 const 看起来合乎逻辑,我不喜欢允许破坏原始字符串来计算长度的 strlen。
猜你喜欢
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
相关资源
最近更新 更多