2010-11-11 59 views

Trả lời

22

Nếu bạn có thể giải quyết cho một const char*, bạn chỉ cần gọi phương thức c_str() vào nó:

const char *mycharp = mystring.c_str(); 

Nếu bạn thực sự cần một sửa đổi char*, bạn sẽ cần phải tạo một bản sao của bộ đệm của chuỗi. Một vector là một cách lý tưởng xử lý này cho bạn:

std::vector<char> v(mystring.length() + 1); 
std::strcpy(&v[0], mystring.c_str()); 
char* pc = &v[0];
14

Gọi str.c_str() để có được một const char*:

const char *pch = str.c_str(); 

Lưu ý rằng kết quả const char* chỉ có giá trị cho đến khi str bị thay đổi hoặc bị phá hủy.


Tuy nhiên, nếu bạn thực sự cần một phi const, có lẽ bạn không nên sử dụng std::string, vì nó không được thiết kế để cho phép thay đổi dữ liệu cơ bản của nó sau lưng nó. Điều đó nói rằng, bạn có thể nhận được một con trỏ đến dữ liệu của nó bằng cách gọi &str[0] hoặc &*str.begin().

Độ xấu của việc này phải được coi là một tính năng. Trong C++ 98, std::string thậm chí không cần thiết để lưu trữ dữ liệu của nó trong một đoạn bộ nhớ liền kề, do đó, điều này có thể phát nổ vào khuôn mặt của bạn. Tôi nghĩ rằng đã thay đổi, nhưng tôi thậm chí không thể nhớ cho dù điều này là dành cho C + + 03 hoặc phiên bản tiếp theo sắp tới của tiêu chuẩn, C + + 1x.

Nếu bạn cần thực hiện việc này, hãy cân nhắc sử dụng std::vector<char> thay thế. Bạn có thể truy cập dữ liệu của nó theo cùng một cách: &v[0] hoặc &*v.begin().

3

Sử dụng phương pháp c_str() trên đối tượng string để nhận con trỏ const char*. Cảnh báo: Con trỏ trả về không còn hợp lệ nếu đối tượng string được sửa đổi hoặc bị hủy.

1

std::string::c_str() trả về chuỗi c có cùng nội dung với đối tượng string.

std::string str("Hello"); 
const char* cstr = str.c_str(); 
3

Vì bạn muốn đi từ một string đến một char* (tức là, không phải là một const char*), bạn có thể làm điều này nhưng hãy cẩn thận: có thể là con rồng ở đây:

string foo = "foo"; 
char* foo_c = &foo[0]; 

Nếu bạn cố gắng để thay đổi nội dung của chuỗi, bạn thực sự tốt và thực sự.

+0

Vấn đề không chỉ là sửa đổi nội dung - nội dung của chuỗi không được đảm bảo tiếp giáp, vì vậy nó có thể không hoạt động chút nào. – CiscoIPPhone

+0

Tôi có thể sai ở đó, theo câu trả lời được chấp nhận cho câu hỏi này, nó được đảm bảo tiếp giáp trong tiêu chuẩn mới: http://stackoverflow.com/questions/1986966/does-s0-point-to-contiguous-characters-in -a-stdstring – CiscoIPPhone

2

Nếu const char* là tốt cho bạn sau đó sử dụng này: myString.c_str()

Nếu bạn thực sự cần char* và biết chắc chắn rằng char* sẽ không thay đổi thì bạn có thể sử dụng này: const_cast<char*>(myString.c_str())

Nếu char* có thể thay đổi sau đó bạn cần phải sao chép chuỗi vào một cái gì đó khác và sử dụng thay vào đó. Điều gì đó khác có thể là std::vector hoặc new char[], điều đó tùy thuộc vào nhu cầu của bạn.

8
//assume you have an std::string, str. 
char* cstr = new char[str.length() +1]; 
strcpy(cstr, str.c_str()); 

//eventually, remember to delete cstr 
delete[] cstr; 
Các vấn đề liên quan