虽然我知道转换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