Мне нужно использовать std::string
для хранения данных, полученных fgets()
. Для этого мне нужно преобразовать char*
возвращаемое значение из fgets()
в std::string
для хранения в массиве. Как это может быть сделано?
Мне нужно использовать std::string
для хранения данных, полученных fgets()
. Для этого мне нужно преобразовать char*
возвращаемое значение из fgets()
в std::string
для хранения в массиве. Как это может быть сделано?
Ответы:
std::string
есть конструктор для этого:
const char *s = "Hello, World!";
std::string str(s);
Обратите внимание, что эта конструкция копирует список символов в s
и s
не должно быть nullptr
, иначе поведение не определено.
str
это просто имя переменной. Это может быть что угодно: S
, abc
, l
, I
, strHelloWorld
. Очевидно, что некоторые варианты лучше, чем другие. Но для этого примера str
это вполне приемлемо.
Если вы уже знаете размер символа *, используйте это вместо
char* data = ...;
int size = ...;
std::string myString(data, size);
Это не использует strlen.
РЕДАКТИРОВАТЬ: Если строковая переменная уже существует, используйте assign ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
Большинство ответов говорит о строительстве std::string
.
Если уже построен, просто используйте оператор присваивания .
std::string oString;
char* pStr;
... // Here allocate and get character string (e.g. using fgets as you mentioned)
oString = pStr; // This is it! It copies contents from pStr to oString
Передайте это через конструктор:
const char* dat = "my string!";
std::string my_string( dat );
Вы можете использовать функцию string.c_str (), чтобы пойти другим путем:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
возвращаетсяconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
Я хотел бы упомянуть новый метод, который использует пользовательский литерал s
. Это не ново, но будет более распространенным, потому что было добавлено в C ++ 14 Standard Library.
Во многом лишнее в общем случае:
string mystring = "your string here"s;
Но это позволяет вам использовать auto, также с широкими строками:
auto mystring = U"your UTF-32 string here"s;
И вот где это действительно сияет:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
Я только что боролся с MSVC2005, чтобы использовать std::string(char*)
конструктор, как самый лучший ответ. Поскольку я вижу этот вариант в списке № 4 на http://en.cppreference.com/w/cpp/string/basic_string/basic_string , которому всегда доверяют , я полагаю, что даже старый компилятор предлагает это.
Мне потребовалось так много времени, чтобы понять, что этот абсолютный конструктор отказывается соответствовать (unsigned char*)
аргументу! Я получил эти непонятные сообщения об ошибках о несоответствии с std::string
типом аргумента, что определенно не было тем, к чему я стремился. Просто аргументированно std::string((char*)ucharPtr)
решил мою проблему ... ах!
char* data;
std::string myString(data);
data
остается неинициализированным (пустым).
Не уверен, почему никто кроме Эрика не упомянул об этом, но согласно этой странице оператор присваивания работает просто отлично. Нет необходимости использовать конструктор, .assign () или .append ().
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(и +=
). Кажется, что это не так с литералами, а просто с char*
вещами. Вопрос о том , такие сообщения на самом деле утечки обсуждаются здесь . Но если я изменил присвоение destString = std::string(srcCharPtr);
Valgrind, отчеты об утечках исчезли. YMMV.
Constructs an object of class basic_string and determines its initial string value from the array
. Он говорит значение и ничего о буферах или владении указателем.