2011-01-14 36 views
32

Nếu mảng là null-chấm dứt này sẽ là khá thẳng về phía trước:sao chép không null-chấm dứt mảng char unsigned để std :: string

unsigned char u_array[4] = { 'a', 's', 'd', '\0' }; 
std::string str = reinterpret_cast<char*>(u_array); 
std::cout << "-> " << str << std::endl; 

Tuy nhiên, tôi tự hỏi cách thích hợp nhất để là gì sao chép một phi null-chấm dứt unsigned mảng char, như sau:

unsigned char u_array[4] = { 'a', 's', 'd', 'f' }; 

thành một std::string.

Có cách nào để thực hiện điều đó mà không cần lặp qua mảng char chưa ký?

Cảm ơn tất cả.

Trả lời

36

std::stringconstructor mà phải mất một cặp vòng lặp và unsigned char thể được chuyển đổi (một cách định nghĩa thực hiện) để char để làm việc này. Không cần một số reinterpret_cast.

unsigned char u_array[4] = { 'a', 's', 'd', 'f' }; 

#include <string> 
#include <iostream> 
#include <ostream> 

int main() 
{ 
    std::string str(u_array, u_array + sizeof u_array/sizeof u_array[0]); 
    std::cout << str << std::endl; 
    return 0; 
} 

Tất nhiên, chức năng mẫu "mảng kích thước" mạnh hơn tính toán sizeof.

+0

Chuyển 'unsigned char *' thành 'char *' ở đây, bạn phải làm 'reinterpret_cast '. –

+1

@VladLazarenko: Nhưng tôi không muốn thực hiện chuyển đổi đó. –

+0

@Charles: Sau đó, mã của bạn sẽ không biên dịch trừ khi bạn thay đổi kiểu mặc định cho char thành unsigned trong cài đặt của trình biên dịch;) –

3

std :: chuỗi có một phương thức có tên là gán. Bạn có thể sử dụng một char * và kích thước.

http://www.cplusplus.com/reference/string/string/assign/

+2

Nó cũng có một hàm tạo lấy con trỏ char và kích thước. Trong những trường hợp đó, khi bạn chưa có một cá thể chuỗi, nó sẽ có ý nghĩa khi sử dụng hàm tạo. –

+0

Vấn đề với tình huống này là bạn sau đó không biết có bao nhiêu byte chuỗi của bạn mất, và có hay không làm .c_str() sẽ cung cấp cho bạn một chuỗi c hợp lệ hay không. –

12

Vâng, rõ ràng std :: stringconstructor mà có thể được sử dụng trong trường hợp này:

std::string str(reinterpret_cast<char*>(u_array), 4); 
+1

Nhiều tư tưởng ý thức hệ, nhưng sẽ đẹp hơn nếu không bỏ đi các chòm sao. Thêm vào đó, lấy kích thước của nó thay vì mã hóa cứng dễ bị lỗi '4'. –

0

Bạn có thể tạo ra một con trỏ trỏ nhân vật với nhân vật đầu tiên, và cái khác trỏ đến một trong quá khứ, và xây dựng bằng cách sử dụng hai con trỏ đó làm vòng lặp. Như vậy:

std::string str(&u_array[0], &u_array[0] + 4); 
+1

Đây là lỗi dễ bị kích thước của mảng có thể thay đổi và bạn có thể dễ dàng quên thay thế '4' bằng một giá trị mới. Ngoài ra, không có điểm nào trong việc thực hiện '& u_array [0]', nó chỉ tương đương với 'u_array', ít bị đánh máy hơn nhiều. –

0

Hãy thử:

std::string str; 
str.resize(4); 
std::copy(u_array, u_array+4, str.begin()); 
2

Bạn có thể sử dụng std::string constructor này:

string (const char * s, size_t n); 

như vậy trong ví dụ của bạn:

std::string str(u_array, 4); 
+0

Bạn có thể làm cho nó tốt hơn bằng cách thực hiện 'sizeof (u_array)'. Hoặc thậm chí tốt hơn - 'sizeof (u_array)/sizeof (u_array [0])', sẽ hoạt động đối với các kiểu dữ liệu kích thước của người lớn hơn 1 byte. –

1

này nên làm điều đó:

std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0])); 
+0

u_array là loại unsigned char, và 'std :: string' của constructor có' const char * ', do đó, điều này thậm chí sẽ không biên dịch. –

+0

@Vlad Lazarenko: Không, như tôi đã kiểm tra nó sẽ là tốt. – cpx

+0

@Dave, loại mặc định cho char được ký, không được ký, và nó không thể chuyển đổi ngầm thành một cái khác. Trình biên dịch của bạn hoặc xử lý 'char' là 'unsigned' hoặc nó là lỗi. Trong mọi trường hợp, giải pháp chung không nên dựa vào các chi tiết cụ thể này và sử dụng chuyển đổi rõ ràng. Bạn có thể kiểm tra điều này với Comeau trực tuyến hoặc một cái gì đó, nó không hoạt động. –

3

Khi xây dựng một chuỗi mà không chỉ định kích thước của nó, hàm tạo sẽ lặp qua một mảng ký tự và tìm null-terminator, ký tự là '\0'. Nếu bạn không có ký tự đó, bạn phải chỉ định độ dài một cách rõ ràng, ví dụ:

// --*-- C++ --*-- 

#include <string> 
#include <iostream> 


int 
main() 
{ 
    unsigned char u_array[4] = { 'a', 's', 'd', 'f' }; 
    std::string str (reinterpret_cast<const char *> (u_array), 
        sizeof (u_array)/sizeof (u_array[0])); 
    std::cout << "-> " << str << std::endl; 
} 
0

std :: string có một hàm tạo lấy một mảng char và độ dài.

unsigned char u_array[4] = { 'a', 's', 'd', 'f' }; 
std::string str(reinterpret_cast<char*>(u_array), sizeo(u_array)); 
0

Ew, tại sao lại là diễn viên?

std::string str(u_array, u_array + sizeof(u_array)); 

Xong.

0

một vẫn còn là một vấn đề khi chuỗi tự chứa một ký tự null và bạn cố gắng để sau đó in ra chuỗi:

char c_array[4] = { 'a', 's', 'd', 0 }; 

std::string toto(array,4); 
cout << toto << endl; //outputs a 3 chars and a NULL char 

Tuy nhiên ....

cout << toto.c_str() << endl; //will only print 3 chars. 

lần nó như thế này khi bạn chỉ muốn mương dễ thương và sử dụng trần C.

Các vấn đề liên quan