在我的例子中,const char * to char *

时间:2016-07-31 11:35:45

标签: c++ string strdup

虽然我知道由于许多问题,在C / C ++中几乎禁止将const char *转换为char *,但我认为我必须转换const char *char *

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

2 个答案:

答案 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:charwchar_tchar16_tchar32_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");
    }