2011-09-14 133 views
35

Tôi vừa bắt đầu đọc C++ và tìm thấy C++ có hàm phong phú cho thao tác chuỗi mà C không có. Tôi đang đọc các chức năng này và đi qua c_str() và từ những gì tôi hiểu là c_str chuyển đổi một chuỗi có thể bị vô hiệu hóa hoặc có thể không phải là một chuỗi chấm dứt null. Có đúng không?Sử dụng hàm c_str Trong C++

Ai đó có thể đề xuất cho tôi một số ví dụ để tôi có thể hiểu việc sử dụng chức năng c_str ??

Trả lời

54

c_str trả về một const char* trỏ đến chuỗi bị chấm dứt không có dấu (ví dụ: chuỗi kiểu C). Nó rất hữu ích khi bạn muốn chuyển "nội dung" ¹ của một std::string đến một hàm dự kiến ​​sẽ làm việc với một chuỗi kiểu C.

Ví dụ, hãy xem xét mã này:

std::string str("Hello world!"); 
int pos1 = str.find_first_of('w'); 

int pos2 = strchr(str.c_str(), 'w') - str.c_str(); 

if (pos1 == pos2) { 
    printf("Both ways give the same result.\n"); 
} 

See it in action.

Ghi chú:

¹ này không hoàn toàn đúng bởi vì một std::string (không giống như một chuỗi C) có thể chứa ký tự \0. Nếu có, mã nhận giá trị trả lại là c_str() sẽ bị lừa khi nghĩ rằng chuỗi ngắn hơn thực sự là vì mã sẽ giải thích \0 là phần cuối của chuỗi.

+0

điểm Rất thú vị bạn đã thực hiện trong Ghi chú: những gì tôi muốn biết nếu std :: string là đã chứa \ 0 thì c_str cũng nối \ 0 vào cuối chuỗi ?? –

+2

@AmitSinghTomar: Có, vì vậy bạn sẽ có hai byte null - một trong đó là một phần hợp pháp của chuỗi và một trong đó được coi là terminator null. Nhưng chức năng kiểu c nhận con trỏ không biết điều này. – Jon

+0

Lưu ý: một số C-API sẽ yêu cầu hai đối số ('char const *, size_t'), thứ hai là kích thước, tất nhiên. –

2

c_str() chuyển đổi chuỗi C++ thành chuỗi kiểu C, về cơ bản là mảng byte bị hủy. Bạn sử dụng nó khi bạn muốn chuyển một chuỗi C++ vào một hàm dự kiến ​​một chuỗi kiểu C (ví dụ: rất nhiều hàm Win32 API, các hàm kiểu POSIX, v.v.).

+2

Tôi sẽ không nói "chuyển đổi". Thay vào đó, hàm "cung cấp truy cập" vào một mảng ký tự chỉ đọc phù hợp - rất có thể là một mảng luôn luôn có trong việc triển khai 'std :: string' để bắt đầu. –

4

Hầu hết các hàm cD và c cũ của OLD, khi xử lý các chuỗi, hãy sử dụng const char*.
Với STL và std::string, string.c_str() được giới thiệu để có thể chuyển đổi từ std::string thành const char*.

Điều đó có nghĩa là nếu bạn hứa sẽ không thay đổi bộ đệm, bạn sẽ có thể sử dụng nội dung chuỗi chỉ đọc. PROMISE = const char *

+0

@ Không có thứ gì như 'stl :: string'. Trong thực tế, thậm chí không có một thứ như "STL" ngoài một bảo tàng ở đâu đó. –

2

Được sử dụng để làm cho std::string tương thích với mã C yêu cầu kết thúc bằng không char*.

29

Trong C++, bạn xác định chuỗi của bạn như

std::string MyString;

thay vì

char MyString[20];.

Khi viết mã C++, bạn gặp phải một số hàm C yêu cầu chuỗi C làm tham số.
Giống như dưới đây:

void IAmACFunction(int abc, float bcd, const char * cstring);

Bây giờ có một vấn đề. Bạn đang làm việc với C++ và bạn đang sử dụng các biến chuỗi std::string. Nhưng hàm C này yêu cầu một chuỗi C.Làm cách nào để chuyển đổi std::string thành chuỗi C chuẩn?

Như thế này:

std::string MyString; 
// ... 
MyString = "Hello world!"; 
// ... 
IAmACFunction(5, 2.45f, MyString.c_str()); 

Đây là c_str() là để làm gì.

Lưu ý rằng, đối với các số std::wstring, c_str() trả về const w_char *.

0

Trong lập trình C/C++ có hai loại chuỗi: chuỗi C và chuỗi chuẩn. Với tiêu đề <string>, chúng tôi có thể sử dụng các chuỗi chuẩn. Mặt khác, các chuỗi C chỉ là một mảng các ký tự bình thường. Vì vậy, để chuyển đổi chuỗi chuẩn thành chuỗi C, chúng tôi sử dụng hàm c_str().

ví dụ

// a string to a C-style string conversion// 

const char *cstr1 = str1.c_str(); 
cout<<"Operation: *cstr1 = str1.c_str()"<<endl; 
cout<<"The C-style string c_str1 is: "<<cstr1<<endl; 
cout<<"\nOperation: strlen(cstr1)"<<endl; 
cout<<"The length of C-style string str1 = "<<strlen(cstr1)<<endl; 

Và đầu ra sẽ được,

Operation: *cstr1 = str1.c_str() 
The C-style string c_str1 is: Testing the c_str 
Operation: strlen(cstr1) 
The length of C-style string str1 = 17 
Các vấn đề liên quan