2

尽管我知道由于许多问题,在 C/C++ 中转换const char *char *几乎被禁止,但我陷入了我认为必须转换const char *char *.

我通过使用从文本文件中获取一个字符串作为字符串c_str,我想修改这个字符串。但是问题在于c_str将字符串转换为const char *. 那么在这种情况下使用它是一个不错的选择,strdup还是有更好的主意呢?

4

2 回答 2

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文档。

于 2016-07-31T12:08:03.107 回答
0

为什么使用 &s[0] 比 c_str 更好?

std::basic_string 类具有data()c_str(). 但是,如您所知,这些函数的结果类型是const CharType*(CharType: char, wchar_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");
    }
    
于 2016-07-31T13:10:16.540 回答