Làm thế nào để chuyển đổi một mảng char thành một chuỗi?


254

Chuyển đổi một C ++ stringthành một mảng char khá đơn giản bằng cách sử dụng c_strchức năng của chuỗi và sau đó thực hiện strcpy. Tuy nhiên, làm thế nào để làm ngược lại?

Tôi có một mảng char như: char arr[ ] = "This is a test";được chuyển đổi trở lại : string str = "This is a test.

Câu trả lời:


369

Các stringlớp có một constructor mà phải mất một C-string NULL-chấm dứt:

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
Nó vẫn sẽ hoạt động theo cách nào. Toán tử gán quá tải mất một const char*, vì vậy bạn có thể truyền cho nó một chuỗi ký tự hoặc chuỗi char (phân rã thành chuỗi đó).
Bí ẩn

3
@ kingsmasher1: Nói đúng ra, các chuỗi ở dạng "hello world" các mảng. Nếu bạn sử dụng sizeof("hello world")nó sẽ cung cấp cho bạn kích thước của mảng (là 12), thay vì kích thước của một con trỏ (có thể là 4 hoặc 8).
dreamlax

7
Lưu ý rằng điều này chỉ hoạt động đối với các chuỗi C kết thúc NULL không đổi . Hàm stringtạo sẽ không làm việc với, ví dụ, một chuỗi đối số đã qua được khai báo là unsigned char * buffer, một cái gì đó rất phổ biến trong các thư viện xử lý luồng byte.
CXJ

4
Không cần bất cứ điều gì là không đổi. Nếu bạn có bộ đệm byte thuộc bất kỳ loại char nào, bạn có thể sử dụng hàm tạo khác: std::string str(buffer, buffer+size);nhưng có lẽ tốt hơn là nên sử dụng bộ đệm std::vector<unsigned char>trong trường hợp đó.
R. Martinho Fernandes

2
Mặc dù nó có thể là rõ ràng: strkhông một chuyển đổi chức năng ở đây. Nó là tên của biến chuỗi. Bạn có thể sử dụng bất kỳ tên biến nào khác (ví dụ string foo(arr);). Việc chuyển đổi được thực hiện bởi hàm tạo của std :: string được gọi ngầm.
Christopher K.

55

Một giải pháp khác có thể trông như thế này,

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

mà tránh sử dụng một biến phụ.


Bạn có thể chỉ ra trong câu trả lời khác với câu trả lời được chấp nhận của tôi không?
Maarten Bodewes

@owlstead vui lòng xem chỉnh sửa. Tôi chỉ đơn giản là đặt câu trả lời của mình vì đó là những gì tôi ước tôi đã thấy khi lần đầu tiên bắt gặp trang này để tìm câu trả lời. Nếu ai đó ngu ngốc như tôi đi qua trang này nhưng không thể tạo ra kết nối đó từ việc nhìn vào câu trả lời đầu tiên, tôi hy vọng câu trả lời của tôi sẽ giúp họ.
stackPizer

5
Vì chuỗi () là hàm tạo của std :: string, nên có thể đề cập rằng bạn cần thêm không gian tên std trong trường hợp bạn không sử dụng không gian tên std. Ví dụ:cout << "test:" + std::string(arr);
Christopher K.

1
@ChristopherK. Tôi đã bỏ nó đi vì câu trả lời được đánh giá cao nhất. Câu trả lời của tôi có nghĩa là một bổ sung cho câu trả lời đó vì vậy tôi giữ nguyên các giả định. Hy vọng rằng bất cứ ai không hiểu điều đó sẽ thấy nhận xét của bạn
stackPizer

Là str một tên biến hoặc là một khóa ở đây tôi có thể sử dụng string aString(someChar);?
Driss Bounouar

31

Có một vấn đề nhỏ bị bỏ lỡ trong các câu trả lời được bình chọn hàng đầu. Cụ thể, mảng ký tự có thể chứa 0. Nếu chúng ta sẽ sử dụng hàm tạo với tham số duy nhất như được chỉ ra ở trên, chúng ta sẽ mất một số dữ liệu. Giải pháp có thể là:

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

Đầu ra là:

123
123 123 123


2
Đây là câu trả lời tốt hơn nếu bạn đang sử dụng std::stringlàm vùng chứa dữ liệu nhị phân và không thể chắc chắn rằng mảng không chứa '\ 0'.
Assil Ksiksi

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;
}

NGOÀI:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long

Ở đâu miễn phí (tmp)? chuỗi có quan tâm đến điều đó?
huseyin tugrul buyukisik

1
câu hỏi hay. Tôi nghĩ rằng nên có miễn phí vì tôi đang sử dụng malloc.
Cristian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.