34

次のように特定のインデックスで C++ 文字列を変更したい:

string s = "abc";
s[1] = 'a';

次のコードは有効ですか? これはこれを行うための許容可能な方法ですか?

それが有効であると言う参照は見つかりませんでした:

http://www.cplusplus.com/reference/string/string/

これは、「文字列内のオーバーロードされた [] 演算子」を使用して、書き込み操作を実行できることを示しています。

4

4 に答える 4

38

インデックスの に文字を割り当てると、std::string次のように正しい結果が得られます。

#include <iostream>
int main() {
    std::string s = "abc";
    s[1] = 'a';
    std::cout << s;
}

私の IDE/ライブラリ設定に疑問を持っている以下の方々は、jdoodle のデモ: http://jdoodle.com/ia/ljRとスクリーンショット: https://imgur.com/f21rA5Rを参照してください。

どちらが印刷されますかaac。欠点は、文字列 s が空白文字列であるか、書きすぎた場合に、割り当てられていないメモリに誤って書き込む危険性があることです。C++ は喜んで文字列の末尾を削除しますが、これは未定義の動作を引き起こします。

これを行うより安全な方法は、 http string::replace: //cplusplus.com/reference/string/string/replaceを使用することです。

例えば

#include <iostream> 
int main() { 
    std::string s = "What kind of king do you think you'll be?"; 
    std::string s2 = "A good king?"; 
    //       pos len str_repl 
    s.replace(40, 1, s2); 
    std::cout << s;   
    //prints: What kind of king do you think you'll beA good king?
}

replace 関数は文字列 s を受け取り、40 番目の位置で 1 文字の疑問符を文字列 s2 に置き換えます。文字列が空白であるか、範囲外のものを割り当てた場合、未定義の動作はありません。

于 2013-08-19T03:12:23.383 に答える