2016-07-31 5 views
2

私はchar *const char *を変換することはほとんどC/Cで禁止されていることを知っていますが++ので、多くの問題のため、私は私がchar *const char *を変換するために持っていると思うような状況に巻き込まれています。のconstのchar * charへ*私の場合は

c_strを使用して文字列として文字列を取得しましたが、この文字列を変更します。しかし、問題はc_strが文字列をconst char *に変換することです。だから、この場合にはstrdupを使用するのが良い選択でしょうか、これを行う上でより良いアイデアはありますか?下の小さなプログラムに示すように

+3

'c_str'を使用しないでください。 '&s [0]'を使用してください。 –

+1

最善の方法は、コピー、コピーの変更、新しい文字列の作成です。もちろん、これはパフォーマンスコストでの正確さを保証します。同じ長さにしておけば、前のコメントをすることもできます。短縮は実装の定義であり、延長は定義されていません。 –

+0

ありがとう!はい、私は同じ長さを保つでしょう。 @KerrekSB c_strよりも&s [0]を使うのはなぜですか? – wannaqc

答えて

2

は実際に、あなたは直接のstd ::文字列オブジェクトを変更することができ、私は考えて

int main() 
{ 
    std::string s("Hello World"); 
    for(char& c : s) 
    { 
     c = toupper(c); 
    } 
    s[0] = 'h'; 
    s[6] = 'w'; 
    s.resize(12); 
    s[11] = '!'; 
    std::cout << s; 
    return 0; 
} 

、それは自己説明です。サイズは変わらないとおっしゃいましたが、その場合も例を追加しました。resizeを参照してください。 insertのように、文字列を操作するさらに他の方法があります。 std::stringのドキュメントをご覧ください。

+0

ありがとうございました!私はあなたのソリューションを使用して問題を解決しました:) – wannaqc

0

なぜ& [0]がc_strより優れていますか?

std :: basic_stringクラスはdata()c_str()です。しかし、わかっているように、これらの関数の結果のタイプはconst CharType*(CharType:char,wchar_t,char16_t,char32_t)です。

には2つの方法があります。

  1. const_castを使用してください。しかし、これは非常に汚れたタイプのシステムです。
  2. &s[0]を使用してください。 operator[]は、システムを破壊しません。

    #include <string> 
    #include <type_traits> 
    int main(){ 
        std::string s1 = "Hello world"; 
        static_assert(std::is_same<char&, decltype(s1[0])>::value, "err"); 
        static_assert(std::is_same<char*, decltype(&s1[0])>::value, "err"); 
        const std::string s2 = "Hello world"; 
        static_assert(std::is_same<const char&, decltype(s2[0])>::value, "err"); 
        static_assert(std::is_same<const char*, decltype(&s2[0])>::value, "err"); 
    } 
    
関連する問題