虽然我知道由于许多问题,在C / C ++中几乎禁止将const char *
转换为char *
,但我认为我必须转换const char *
到char *
。
我使用c_str
从文本文件中获取字符串作为字符串,我想修改此字符串。但问题是c_str
会将字符串转换为const char *
。那么在这种情况下使用strdup
是一个不错的选择,还是有更好的想法呢?
答案 0 :(得分: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文档。
答案 1 :(得分:0)
为什么使用&amp; 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");
}