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

const char * to char * in my case

本文关键字:char const 我的      更新时间:2023-10-16

虽然我知道在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;
}

我认为,这是自我解释。虽然您提到大小不会改变,但我也为这种情况添加了一个示例,请参见调整大小。还有其他方法可以操作字符串,例如insert。看看std::string文档。

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

std::basic_string类有data()c_str()。但是,正如您所知,这些函数的结果类型是const CharType*(CharType:charwchar_tchar16_tchar32_t)。

有两种方法可以获得CharType*

  1. 使用CCD_ 17。然而,这是一个非常肮脏和破碎的系统
  2. 使用CCD_ 18。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");
    }