const char * to char * в моем случае

Хотя я знаю, что преобразование const char * в char * почти запрещен в C / C ++ из-за многих проблем, я попал в ситуацию, когда я думаю, что я должен конвертировать const char * в char *,

Я получаю строку из текстового файла в виде строки, используя c_str и я хочу изменить эту строку. Однако проблема в том, что c_str преобразует строку в const char *, Так что это хороший выбор для использования strdup в этом случае или есть ли лучшая идея в этом?

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;
}

Я думаю, это самоочевидно. Хотя вы упомянули, что размер не меняется, я добавил пример для этого случая, см. изменить размер. Есть еще другие способы манипулирования строкой, такие как вставить. Посмотрите на станд :: строка документация.

2

Другие решения

Почему используется &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");
    }
    
0

По вопросам рекламы [email protected]