2016-07-31 105 views
2

雖然我知道轉換const char *char *在C/C幾乎禁止++,因爲很多問題,我在一個情況下,我認爲我必須const char *轉換爲char *趕上了。爲const char *爲char *在我的情況

我使用c_str作爲字符串從文本文件中獲取字符串,我想修改此字符串。但問題是,c_str將字符串轉換爲const char *。那麼在這種情況下使用strdup是個不錯的選擇,還是有更好的主意?

+3

不要使用'c_str'。使用'&s [0]'。 –

+1

最好的方法是複製,修改副本,然後創建一個新的字符串。當然,這保證了性能成本的正確性。如果保持相同的長度,您也可以執行之前的評論。縮短是實現定義的,延長是未定義的。 –

+0

非常感謝!是的,我會保持相同的長度。 @KerrekSB爲什麼使用&s [0]比c_str更好? – wannaqc

回答

2

其實,你可以直接修改的std :: string對象,如下面的小程序說明:

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

爲什麼使用& s [0]比c_str好?

std :: basic_string類有data()c_str()。但是,正如您所知,這些函數的結果類型爲const CharType*(CharType:charwchar_t,char16_t,char32_t)。

有兩種方法可以獲得CharType*

  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"); 
    }