Хотя я знаю, что преобразование const char *
в char *
почти запрещен в C / C ++ из-за многих проблем, я попал в ситуацию, когда я думаю, что я должен конвертировать 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;
}
Я думаю, это самоочевидно. Хотя вы упомянули, что размер не меняется, я добавил пример для этого случая, см. изменить размер. Есть еще другие способы манипулирования строкой, такие как вставить. Посмотрите на станд :: строка документация.
Почему используется &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");
}