1

rtrim()アルゴリズムを使用せずに、C++ の文字列ヘッダーから関数を使用して文字列をトリミングしようとしています。
私がしたことは、スペースが存在する場合は開始位置と終了位置を調べることでした。使用して削除するだけですisspace()が、コンパイルすると、次のエラーが発生します。

タイプ 'const char*' の右辺値からのタイプ 'std::string& {aka std::basic_string&}' の非 const 参照の無効な初期化</p>

ここに私のコードがあります:

#include <iostream>
#include <string>
using namespace std;

string rtrim(string& s) {
    size_t i;
    for(i = s.length() - 1; i != (size_t)-1; i--) {
        if(!(isspace(s[i]))){
            break;
        }
    }
    return s.substr(0, i + 1);
}

int main(){
    cout << "|" << rtrim("   hello world\t ") << "|" << endl;
}

などのパラメーターを設定しstring s = ( "hello world\t ");て実行すると、動作cout << rtrim(s) << endl;しているように見えますが、上記のコードのようには動作しません。助言がありますか?

4

1 に答える 1

0

上記のコードはstd::string、スタック上に の一時オブジェクトを作成し、それを非 const 参照として関数に渡します。これは、関数がオブジェクトを変更する可能性があるため (これは意味がありません)、オブジェクトへの参照を覚えていて、オブジェクトが既に破棄されている場合にスコープ外に変更しようとする可能性があるため、危険です。

あなたの関数では、実際にはnon-const参照を必要としないので、パラメータをに変更するだけで機能しますconst std::string &s

于 2016-01-28T11:22:09.653 に答える