Мне нужно использовать std::string
для хранения данных, полученных fgets()
. Для этого мне нужно преобразовать char*
возвращаемое значение из fgets()
в std::string
для хранения в массиве. Как это может быть сделано?
262
std::string
есть конструктор для этого:
const char *s = "Hello, World!";
std::string str(s);
Обратите внимание, что эта конструкция копирует список символов в s
и s
не должно быть nullptr
, иначе поведение не определено.
str
это просто имя переменной. Это может быть что угодно:S
,abc
,l
,I
,strHelloWorld
. Очевидно, что некоторые варианты лучше, чем другие. Но для этого примераstr
это вполне приемлемо.Если вы уже знаете размер символа *, используйте это вместо
Это не использует strlen.
РЕДАКТИРОВАТЬ: Если строковая переменная уже существует, используйте assign ():
источник
Большинство ответов говорит о строительстве
std::string
.Если уже построен, просто используйте оператор присваивания .
источник
Зачем использовать,
fgets()
когда вы программируете на C ++? Почему нетstd::getline()
?источник
Передайте это через конструктор:
Вы можете использовать функцию string.c_str (), чтобы пойти другим путем:
источник
c_str()
возвращаетсяconst char*
источник
источник
Я хотел бы упомянуть новый метод, который использует пользовательский литерал
s
. Это не ново, но будет более распространенным, потому что было добавлено в C ++ 14 Standard Library.Во многом лишнее в общем случае:
Но это позволяет вам использовать auto, также с широкими строками:
И вот где это действительно сияет:
источник
Я только что боролся с MSVC2005, чтобы использовать
std::string(char*)
конструктор, как самый лучший ответ. Поскольку я вижу этот вариант в списке № 4 на http://en.cppreference.com/w/cpp/string/basic_string/basic_string , которому всегда доверяют , я полагаю, что даже старый компилятор предлагает это.Мне потребовалось так много времени, чтобы понять, что этот абсолютный конструктор отказывается соответствовать
(unsigned char*)
аргументу! Я получил эти непонятные сообщения об ошибках о несоответствии сstd::string
типом аргумента, что определенно не было тем, к чему я стремился. Просто аргументированноstd::string((char*)ucharPtr)
решил мою проблему ... ах!источник
источник
data
остается неинициализированным (пустым).Не уверен, почему никто кроме Эрика не упомянул об этом, но согласно этой странице оператор присваивания работает просто отлично. Нет необходимости использовать конструктор, .assign () или .append ().
источник
=
(и+=
). Кажется, что это не так с литералами, а просто сchar*
вещами. Вопрос о том , такие сообщения на самом деле утечки обсуждаются здесь . Но если я изменил присвоениеdestString = std::string(srcCharPtr);
Valgrind, отчеты об утечках исчезли. YMMV.Constructs an object of class basic_string and determines its initial string value from the array
. Он говорит значение и ничего о буферах или владении указателем.