Мне нужно использовать std::string
для хранения данных, полученных по fgets()
. Для этого мне нужно преобразовать вывод fgets() char*
в файл std::string
для хранения в массиве. Как это может быть сделано?конвертировать char * в std :: string
ответ
std::string
имеет конструктор для этого:
const char *s = "Hello, World!";
std::string str(s);
Просто убедитесь, что ваш char *
не NULL
, или же поведение не определено.
char* data;
std::string myString(data);
Это приведет к неопределенному поведению. – 2009-07-28 18:05:02
Только с этими двумя строками 'data' остается неинициализированным (пустым). – heltonbiker
Без истинной «длины» указателя, данный код может привести к потерям данных, ваша std :: string будет «короче», чем исходный символ * – Andiana
передать его через конструктор:
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 *' –
правильно, вы не можете (не должны) изменять данные в std :: string через c_str(). Если вы намерены изменить данные, то строка c из c_str() должна быть memcpy'd –
Если вы уже знаете размер полукокса * , используйте это вместо этого
char* data = ...;
int size = ...;
std::string myString(data, size);
Это не использует strlen.
EDIT: Если переменная строка уже существует, то использование правопреемнику():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
мне нужно использовать зЬй :: строку для хранения данных, полученных с помощью fgets().
Зачем использовать fgets()
, когда вы программируете C++? Почему не std::getline()
?
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::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;
Не знаете, почему никто кроме Эрика не упомянул об этом, но согласно this page, назначенный оператор очень хорошо работает. Не нужно использовать конструктор, .assign() или .append().
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
Кажется, что это работает функционально, но когда я это сделал, я начал получать проблемы с сообщениями достижимых блоков Valgrind в конце программы, исходя из «нового» внутри '=' (и '+ ='). Кажется, это не так с литералами, как это, но просто с символом 'char *'. Вопрос о том, являются ли такие отчеты «фактическими» утечками [обсуждаются здесь] (http://stackoverflow.com/q/2996498/211160).Но если я изменил назначение на 'destString = std :: string (srcCharPtr),' сообщения об утечке valgrind исчезли. YMMV. – HostileFork
Комментарий HostileFork может заставить вас поверить, что построение строки из char * (например, из fgets) заставит std :: string управлять временем жизни этой памяти. Однако, это не так. См. Стандарт 21.4.2.7 и .9 «Создает объект класса basic_string и определяет его начальное строковое значение из массива». Он говорит о ценности и ничего о буферах или владении указателем. –
char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;
Я просто борюсь с 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!
Большая часть ответов говорит о 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
- 1. std :: string vs. char *
- 2. Копирование std :: string в char *
- 3. Как преобразовать std :: string в const char *?
- 4. конвертировать std :: string в basic_ostream?
- 5. C++ конвертировать std :: string, которая содержит двоичные данные для char *
- 6. std :: string get (char *) вместо (const char *)
- 7. Coverting std :: String to char *
- 8. C++ конкатенация unterminated char * to std :: string
- 9. std :: array <char, N> to std :: string
- 10. Создает ли выражение "std :: string + char" еще одну std :: string?
- 11. Преобразование std :: __ cxx11 :: string to std :: string
- 12. Включите std :: string в массив char * const *
- 13. Как преобразовать char [] в std :: string
- 14. Невозможно преобразовать 'std :: string' в 'const char *
- 15. Как преобразовать «char» в «std :: string»?
- 16. Помещение std :: string в массив char [] []
- 17. Преобразование char в std :: string не работает
- 18. Как поместить char array в std :: string
- 19. Как сохранить const char * [] в std :: string?
- 20. как конвертировать System :: String в const char *?
- 21. Предпочтительное преобразование из char (не char *) в std :: string
- 22. error: невозможно преобразовать 'std :: string {aka std :: basic_string <char>}' to 'char *' в инициализации
- 23. конвертировать вектор <string> в char ** C++
- 24. конвертировать char * в char? C++
- 25. Как сопоставить 2 char * массивы непосредственно в std :: map <std :: string, std :: string>
- 26. C++ std :: string и NULL const char *
- 27. Deep copy std :: string :: c_str() to char *
- 28. return char из std :: string vector
- 29. Parse unsigned char [] to std :: string
- 30. const unsigned char * to std :: string
, что произойдет, если это произойдет? –
@Jesse Какова ваша основа для высказывания такого исключения? – 2009-07-28 18:14:10
@Neil, моя реализация (gcc) делает. Я не могу найти официальный ответ здесь. Что указано? –