雖然我知道轉換const char *
到char *
在C/C幾乎禁止++,因爲很多問題,我在一個情況下,我認爲我必須const char *
轉換爲char *
趕上了。爲const char *爲char *在我的情況
我使用c_str
作爲字符串從文本文件中獲取字符串,我想修改此字符串。但問題是,c_str
將字符串轉換爲const char *
。那麼在這種情況下使用strdup
是個不錯的選擇,還是有更好的主意?
雖然我知道轉換const char *
到char *
在C/C幾乎禁止++,因爲很多問題,我在一個情況下,我認爲我必須const char *
轉換爲char *
趕上了。爲const char *爲char *在我的情況
我使用c_str
作爲字符串從文本文件中獲取字符串,我想修改此字符串。但問題是,c_str
將字符串轉換爲const char *
。那麼在這種情況下使用strdup
是個不錯的選擇,還是有更好的主意?
其實,你可以直接修改的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文檔。
謝謝!我使用你的解決方案解決了問題:) – wannaqc
爲什麼使用& s [0]比c_str好?
std :: basic_string類有data()
和c_str()
。但是,正如您所知,這些函數的結果類型爲const CharType*
(CharType:char
,wchar_t
,char16_t
,char32_t
)。
有兩種方法可以獲得CharType*
。
const_cast
。但是,這是非常骯髒的破解類型系統。使用&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");
}
不要使用'c_str'。使用'&s [0]'。 –
最好的方法是複製,修改副本,然後創建一個新的字符串。當然,這保證了性能成本的正確性。如果保持相同的長度,您也可以執行之前的評論。縮短是實現定義的,延長是未定義的。 –
非常感謝!是的,我會保持相同的長度。 @KerrekSB爲什麼使用&s [0]比c_str更好? – wannaqc