Як перетворити масив char у рядок?


254

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

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

Відповіді:


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;

2
Це все одно працюватиме в будь-якому випадку. Оператор перевантаженого присвоєння приймає a const char*, тому ви можете передавати йому рядковий буквений ряд або масив 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);

що дозволяє уникнути використання додаткової змінної.


Чи не могли б ви вказати у відповіді, чим це відрізняється від прийнятої відповіді на мою «Загадку»?
Maarten Bodewes

@owlstead, будь ласка, дивіться редагування. Я просто ставлю свою відповідь, тому що її те, що я хотів би побачити, коли я вперше натрапив на цю сторінку, шукаючи відповіді. Якщо хтось настільки ж німий, як я, натрапив на цю сторінку, але не в змозі зв'язати цей зв’язок з першої відповіді, сподіваюся, моя відповідь їм допоможе.
stackPusher

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

Де безкоштовно (tmp)? чи рядок піклується про це?
huseyin tugrul buyukisik

1
Гарне питання. Я думаю, що вільне повинно бути там, бо я використовую malloc.
Крістіан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.