Как преобразовать массив символов в строку?

254

Конвертировать C ++ stringв массив char довольно просто, используя c_strфункцию string и затем делая это strcpy. Однако как сделать наоборот?

У меня есть массив символов , как: char arr[ ] = "This is a test";быть преобразован обратно в: string str = "This is a test.

kingsmasher1
источник

Ответы:

369

stringКласс имеет конструктор , который принимает NULL завершающего C-строку:

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

// or
str = arr;
Mysticial
источник
2
Это все равно будет работать в любом случае. Перегруженный оператор присваивания принимает a const char*, так что вы можете передать ему строковый литерал или массив символов (который затухает).
Мистика
3
@ kingsmasher1: Строго говоря, строки в форме "hello world" являются массивами. Если вы используете sizeof("hello world")его, вы получите размер массива (который равен 12), а не размер указателя (вероятно, 4 или 8).
Dreamlax
7
Обратите внимание, что это работает только для константных C-строк с концевыми NULL. stringКонструктор не будет работать, например, переданная строка аргумент объявлен как unsigned char * buffer, что - то очень часто при обработке потока байтов библиотеки.
CXJ
4
Нет необходимости быть постоянным. Если у вас есть байтовый буфер любого типа char, вы можете использовать другой конструктор:, std::string str(buffer, buffer+size);но в этом случае, вероятно, лучше придерживаться std::vector<unsigned char>.
Р. Мартиньо Фернандес
2
Хотя это может быть очевидно: strздесь нет функции преобразования. Это имя строковой переменной. Вы можете использовать любое другое имя переменной (например string foo(arr);). Преобразование выполняется конструктором std :: string, который вызывается неявно.
Кристофер К.
55

Другое решение может выглядеть так,

char arr[] = "mom";
std::cout << "hi " << std::string(arr);

который избегает использования дополнительной переменной.

stackPusher
источник
Не могли бы вы указать в ответе, как это отличается от принятого ответа, мой Misticial?
Maarten Bodewes
@owlstead, пожалуйста, смотрите редактирование. Я просто положил свой ответ, потому что это то, что я хотел бы видеть, когда я впервые наткнулся на эту страницу в поисках ответа. Если кто-то такой же глупый, как я, сталкивается с этой страницей, но не может установить связь с просмотром первого ответа, я надеюсь, что мой ответ поможет им.
стекPusher
5
Поскольку string () является конструктором std :: string, возможно, стоит упомянуть, что вам нужно добавить пространство имен std, если вы не используете пространство имен std. Пример:cout << "test:" + std::string(arr);
Кристофер К.
1
@ChristopherK. Я пропустил это, потому что так сделал ответ с самым высоким рейтингом. Мой ответ является дополнением к этому ответу, поэтому я придерживался тех же предположений. Надеюсь, любой, кто не понимает этого, увидит ваш комментарий
stackPusher
Str - это имя переменной или это ключ, который я могу использовать string aString(someChar);?
Дрисс Бунуар
31

В самых популярных ответах пропущена небольшая проблема. А именно, массив символов может содержать 0. Если мы будем использовать конструктор с одним параметром, как указано выше, мы потеряем некоторые данные. Возможное решение:

cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;

Выход:

123
123 123

Йола
источник
2
Это лучший ответ, если вы используете std::stringв качестве контейнера для двоичных данных и не можете быть уверены, что массив не содержит '\ 0'.
Ассил Ксикси
11
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main ()
{
  char *tmp = (char *)malloc(128);
  int n=sprintf(tmp, "Hello from Chile.");

  string tmp_str = tmp;


  cout << *tmp << " : is a char array beginning with " <<n <<" chars long\n" << endl;
  cout << tmp_str << " : is a string with " <<n <<" chars long\n" << endl;

 free(tmp); 
 return 0;
}

ВНЕ:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long
Cristian
источник
Где бесплатно (тмп)? об этом заботится строка?
хусейн тугрул буюкисик
1
хороший вопрос. Я думаю, что свободный должен быть там, потому что я использую malloc.
Кристиан