2010-11-17 36 views
20

thể trùng lặp:
Convert std::string to const char* or char*Làm thế nào để chuyển đổi std :: string để const char *?

void Foo::bar(const std::string& foobar) { 
    // ... 
    const char* foobar2 = (char*)foobar; 
    // ... 
} 

Điều đó không làm việc và tôi nhận được một lỗi trong quá trình biên soạn về đúc hợp lệ.

Có cách nào khác để chuyển đổi std::string thành const char* không?

+0

Tại sao bạn muốn thực hiện việc này? – GManNickG

+1

@GMan: có vô số lý do, nguyên nhân chính đang gọi hàm trong API C? –

+2

@Gman Bởi vì tôi cần chuyển biến foobar sang hàm inet_pton của UDT chỉ lấy các biến kiểu char *. –

Trả lời

10

std::string::c_str() giúp bạn một con trỏ const char* tới một mảng ký tự đại diện cho chuỗi (null-chấm dứt).

Bạn không nên thao tác dữ liệu mà con trỏ này trỏ đến, vì vậy nếu bạn cần làm điều đó, hãy sao chép dữ liệu.

đúp chỉnh sửa - làm việc đó trong một C hơn ++ thời trang

Vì nó là đẹp hơn để tránh việc sử dụng con trỏ nguyên và mảng nếu có thể, bạn cũng có thể nhận được dữ liệu vào một std::vector<char>

#include <string> 
#include <vector> 

int main() 
{ 
    std::string str = "Hello"; 
    std::vector<char> cvec(str.begin(), str.end()); 

    // do stuff 
} 

chỉnh sửa này là giống như C vì nó sử dụng con trỏ nguyên và rõ ràng phân bổ mem

#include <string> 
#include <cstring> 

int main() 
{ 
    std::string str = "Hello"; 
    char *cptr = new char[str.size()+1]; // +1 to account for \0 byte 
    std::strncpy(cptr, str.c_str(), str.size()); 

    // do stuff... 
    delete [] cptr; 
} 
+3

Sử dụng 'std :: vector', không bao giờ sử dụng' new T [] '. – GManNickG

+0

@GMan - cảm ơn - Tôi luôn luôn mặc định với hành vi theo phong cách C khi một câu hỏi hỏi về con trỏ, mặc dù trong C++ đất tôi biết tôi nên dính vào giảng dạy với các công cụ C++ cấp đầu tiên. – birryree

+0

Tại sao «strncpy' và không phải là' strcpy'? – i486

3
const char* foobar2 = foobar.c_str(); 

Thông báo các const. Nếu không, bạn phải sao chép nó vào bộ đệm char.

4

Bạn sẽ nhận được rất nhiều kinda không chính xác câu trả lời về str.c_str() tại đây. :) Trong khi c_str() thực sự hữu ích, xin lưu ý rằng điều này sẽ không thực sự chuyển đổi chuỗi thành một char*, nhưng thay vì trả lại nội dung của chuỗi dưới dạng const char*. Và đây là một sự khác biệt lớn!

Điều quan trọng ở đây là con trỏ bạn nhận được từ c_str() chỉ hợp lệ miễn là đối tượng string nhất định tồn tại. Vì vậy, đây sẽ là khủng khiếp sai:

class Something { 
    const char* name; 
public: 
    Something(const std::string& pname) { 
     this->name = pname.c_str(); /* wrong! the pointer will go wrong as the object from the parameter ceases to exist */ 
    } 
}; 

Vì vậy, nếu bạn muốn chuyển đổi, như trong: tạo ra một giá trị mới mà sẽ độc lập với bản gốc std::string, sau đó bạn sẽ muốn làm một cái gì đó như này:

char* convert(const std::string& str) { 
    char* result = new char[str.length()+1]; 
    strcpy(result,str.c_str()); 
    return result; 
} 

Nhưng vẫn còn c_str() sẽ khá đủ cho bạn trong hầu hết các trường hợp.Chỉ cần cố gắng suy nghĩ về thời gian của các vật thể.

+2

Nên là 'str.length() + 1' vì độ dài không tính byte rỗng. – birryree

+2

Sử dụng 'std :: vector', không bao giờ sử dụng' new T [] '. – GManNickG

+0

@birryree - Đúng vậy! Cảm ơn. – Kos

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