2013-08-19 8 views
7

私はこのような特定のインデックスでC++の文字列を変更したい時に文字列を変更するための最良の方法:C++、特定のインデックス

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

は、次のコードは有効ですか?これはこれを受け入れる方法ですか?

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

「文字列のオーバーロードされた[]演算子」を通じて、我々は書き込み操作を実行できることを言う:

私はそれが有効であると言うの参照を見つけることができませんでした。

+0

達成するために部分文字列を使用することができますはい、問題ありませんまったく。実際に参照が必要な場合は、C++ 11標準のセクション21.4.5/2を参照してください。 –

+5

C++ 11では、これは実際には標準での欠陥のために禁止されていて、技術的には 's.begin()[1] = 'a'; 'を使う必要があります。 – Potatoswatter

+0

そして、あなたはそれが有効であるとの言及を見つけましたが、cplusplus.comは一般的に標準以下であり、しばしば時代遅れです。リンクを考慮すると、他に何を知りたいのかは不明です。 – Potatoswatter

答えて

9

はい、次のC++プログラム:

#include <iostream> 

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

プリントaac。文字列sが空文字列の場合、割り当てられていないメモリに誤って書き込む危険性があります。 C++はそれを可能にし、未定義の動作につながります。

これを行うための安全な方法はstring::replaceを使用することです:http://cplusplus.com/reference/string/string/replace

+1

安全なバージョンは、string :: replaceを使用することです。http://www.cplusplus.com/reference/string/string/replace/ – Chris

1

はい。あなたがリンクしているウェブサイトにはそのページがあります。また、境界チェックを実行する関数atを使用することもできます。

http://www.cplusplus.com/reference/string/string/operator%5B%5D/

+1

@Potatoswatterなぜですか?要点は、プログラマが境界チェックの使用を選択できるということでした。 –

+0

@NeilKirk:誰もが境界チェックが行われていると仮定し、 'at()'について知らなかったので、変化していると思います。 – cHao

+2

@Potatosは何を確認するのか?この関数は、有効な位置(* 1 *ヌルターミネーターを考慮)で呼び出されるか、その動作は未定義です。 Requires句を参照してください。 –

1

はい、あなたが書いたコードが有効です。また、次のように試すこともできます:

std :: replaceを使用してチャレーターを置き換えることもできます。参考リンクはこちらhttp://www.cplusplus.com/reference/string/string/replace/

希望があります。

0

あなたはこの

string s = "abc"; 
    string new_s = s.substr(0,1) + "a" + s.substr(2); 
    cout << new_s; 
    //you can now use new_s as the variable to use with "aac" 
関連する問題