1

我想创建一个与 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;
}

谢谢!

4

4 回答 4

4

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

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

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

你的字符串是非const.

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

也许你的意思是有参数类型char const*

这将更有意义,然后该功能也将起作用。

干杯&hth.,

于 2011-02-03T19:40:24.547 回答
3

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

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

int strlen1(string str) { return static_cast<int>(str.size()); }
于 2011-02-03T19:33:28.540 回答
1

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

于 2011-02-03T19:33:09.133 回答
0

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

于 2011-02-03T19:32:23.927 回答