1

Strlen と同じことを行う関数を作成したいのですが、「string subscript out of range」というエラーが表示されます。私はそれを修正しようとしましたが、わかりません。

コードは次のとおりです。

#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文字列の長さを超えて要素にアクセスしない for には、未定義の動作があります (より正確には、 non- const operator[]for that を使用する場合)。

C++98 §21.3.4/1、約std::string::operator[]:

の場合pos < size、 を返しますdata()[pos]。それ以外の場合pos == size()constバージョンは を返しますcharT()。それ以外の場合、動作は未定義です。

そして、あなたの文字列は non-constです。

それを作成することはできます。これにより、要素nconstのゼロ結果を保証する標準の特別な規定が呼び出されますが、関数が完全に冗長であるという問題は解決されません。std::string

おそらく、引数 type を持つことを意味しますchar const*

それはより理にかなっており、機能も機能します。

乾杯 & hth.,

于 2011-02-03T19:40:24.547 に答える
3

std::string は C スタイルの文字列 (char const*) と同じであるという誤解を受けているようです。これは単に真実ではありません。null ターミネータはありません。

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 に答える