2009-07-28 3 views
177

Мне нужно использовать std::string для хранения данных, полученных по fgets(). Для этого мне нужно преобразовать вывод fgets() char* в файл std::string для хранения в массиве. Как это может быть сделано?конвертировать char * в std :: string

ответ

260

std::string имеет конструктор для этого:

const char *s = "Hello, World!"; 
std::string str(s); 

Просто убедитесь, что ваш char * не NULL, или же поведение не определено.

+6

, что произойдет, если это произойдет? –

+0

@Jesse Какова ваша основа для высказывания такого исключения? – 2009-07-28 18:14:10

+1

@Neil, моя реализация (gcc) делает. Я не могу найти официальный ответ здесь. Что указано? –

0
char* data; 
std::string myString(data); 
+5

Это приведет к неопределенному поведению. – 2009-07-28 18:05:02

+0

Только с этими двумя строками 'data' остается неинициализированным (пустым). – heltonbiker

+0

Без истинной «длины» указателя, данный код может привести к потерям данных, ваша std :: string будет «короче», чем исходный символ * – Andiana

12

передать его через конструктор:

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(); 
+3

'c_str()' возвращает 'const char *' –

+1

правильно, вы не можете (не должны) изменять данные в std :: string через c_str(). Если вы намерены изменить данные, то строка c из c_str() должна быть memcpy'd –

94

Если вы уже знаете размер полукокса * , используйте это вместо этого

char* data = ...; 
int size = ...; 
std::string myString(data, size); 

Это не использует strlen.

EDIT: Если переменная строка уже существует, то использование правопреемнику():

std::string myString; 
char* data = ...; 
int size = ...; 
myString.assign(data, size); 
+1

Вид побочного вопроса, Юджин. Если ** данные ** не заполняются до тех пор, пока в подпрограмме, как вы тогда инициализируете myString? Вы просто объявляете переменную myString при ее заполнении? – IcedDante

+10

+1 для .assign() Только что я искал: D –

+1

int size = strlen (data); – Vlad

27

мне нужно использовать зЬй :: строку для хранения данных, полученных с помощью fgets().

Зачем использовать fgets(), когда вы программируете C++? Почему не std::getline()?

7
const char* charPointer = "Hello, World!\n"; 
std::string strFromChar; 
strFromChar.append(charPointer); 
std::cout<<strFromChar<<std::endl; 
3

Я хотел бы отметить новый метод, который использует определенный пользователь буквального 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; 
0

Не знаете, почему никто кроме Эрика не упомянул об этом, но согласно this page, назначенный оператор очень хорошо работает. Не нужно использовать конструктор, .assign() или .append().

std::string mystring; 
mystring = "This is a test!"; // Assign C string to std:string directly 
std::cout << mystring << '\n'; 
+1

Кажется, что это работает функционально, но когда я это сделал, я начал получать проблемы с сообщениями достижимых блоков Valgrind в конце программы, исходя из «нового» внутри '=' (и '+ ='). Кажется, это не так с литералами, как это, но просто с символом 'char *'. Вопрос о том, являются ли такие отчеты «фактическими» утечками [обсуждаются здесь] (http://stackoverflow.com/q/2996498/211160).Но если я изменил назначение на 'destString = std :: string (srcCharPtr),' сообщения об утечке valgrind исчезли. YMMV. – HostileFork

+0

Комментарий HostileFork может заставить вас поверить, что построение строки из char * (например, из fgets) заставит std :: string управлять временем жизни этой памяти. Однако, это не так. См. Стандарт 21.4.2.7 и .9 «Создает объект класса basic_string и определяет его начальное строковое значение из массива». Он говорит о ценности и ничего о буферах или владении указателем. –

5
char* data; 
stringstream myStreamString; 
myStreamString << data; 
string myString = myStreamString.str(); 
cout << myString << endl; 
2

Я просто борюсь с msvc2005 использовать std::string(char*) конструктор так же, как первоклассный ответ. Как я вижу, этот вариант, перечисленный как № 4, всегда доверял http://en.cppreference.com/w/cpp/string/basic_string/basic_string, я полагаю, что даже старый компилятор предлагает это.

Мне так долго нужно было понять, что этот конструктор абсолютно не согласен с (unsigned char*) в качестве аргумента! Я получил эти непонятные сообщения об ошибке, которые не совпадали с типом аргумента std::string, который определенно не был тем, к чему я стремился. Просто выставив аргумент с std::string((char*)ucharPtr), я решил свою проблему ... duh!

14

Большая часть ответов говорит о constructionstd::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 
Смежные вопросы