Мені потрібно використовувати 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.
EDIT: Якщо струнна змінна вже існує, використовуйте призначити ():
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;
char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;
Я хотів би згадати новий метод, який використовує визначений користувачем буквал s
. Це не нове, але воно буде більш поширеним, оскільки його додано у стандартну бібліотеку C ++ 14.
В основному зайвим у загальному випадку:
string mystring = "your string here"s;
Але це дозволяє використовувати авто, також із широкими рядками:
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);
вальгриндським звітам про витоки пішов. YMMV.
Constructs an object of class basic_string and determines its initial string value from the array
. Він говорить про значення і нічого про власність буферів або вказівників.