尽管我知道由于许多问题,在 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文档。
为什么使用 &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");
}