2012-10-19 32 views
6

tôi nhận được lỗi sau khi mã này được điều hành:Làm cách nào để chuyển đổi loại std :: basic_string thành một mảng kiểu char?

syslog(LOG_ERR | LOG_USER, "%s",errorString); 

không thể chuyển đổi 'const string {aka const std :: basic_string}' thành 'const char *' cho> Lập luận '2' thành ' khoảng trống syslog (int, const char *, ...)' inServer.cpp/PeCounter
dòng 478 C/C++ vấn đề

tôi daemonizing chương trình và in giá trị ErrorString chỉ tốt khi xuất ra stdio sử dụng cout, nhưng nó sẽ không in khi sử dụng một cuộc gọi syslog.

Bất kỳ cách nào để lấy tiêu chuẩn :: basic_string (char) thành dạng 'const char'.

+1

Gửi câu trả lời của riêng bạn hoàn toàn được chấp nhận ở đây. Bạn không cần phải bao gồm nó trong câu hỏi của bạn, ngay cả với một chỉnh sửa sau này. –

Trả lời

4

Các c_str() hoặc data() chức năng thành viên cung cấp một con trỏ đến phần tử đầu tiên của một mảng của char_type chứa chuỗi của bạn. Nó hợp lệ miễn là đối tượng chuỗi chính nó vẫn hợp lệ và không thay đổi (nhưng hãy cẩn thận rằng các hoạt động có thể gây ra việc tái phân bổ có thể làm mất hiệu lực con trỏ - tốt nhất là không lưu trữ nó).

+2

Chỉ 'c_str()' đảm bảo một terminator ở cuối chuỗi. 'dữ liệu()' có thể trỏ đến một bản sao không được kết nối của chuỗi, điều này rất nguy hiểm đối với hầu hết các API đang mong đợi một 'const char *'. –

+3

@AdrianMcCarthy: Phụ thuộc vào phiên bản C++ bạn đang sử dụng. Trong C++ 11 'dữ liệu()' là nul-chấm dứt là tốt (và đảm bảo được hợp lệ ngay cả trên chuỗi rỗng). Vì vậy, trong C++ 11 sự khác biệt duy nhất giữa 'c_str()' và 'data()' thực sự là const-ness. –

+0

@Matthieu M .: Bạn nói đúng - Tôi đang xem phiên bản trước của thông số kỹ thuật. Tuy nhiên, có rất nhiều người sử dụng thư viện cũ, vì vậy sự khác biệt có thể là quan trọng. Ngoài ra 'c_str()' là một chút gợi ý hơn về ý định. –

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