2010-09-03 30 views
14

Tôi đang cố gắng để in một chuỗi theo cách sau:"printf" trên dây in GIBBERISH

int main(){ 
    string s("bla"); 
    printf("%s \n", s); 
     ....... 
} 

nhưng tất cả tôi nhận được tiếng vô nghia ngẫu nhiên này.

Bạn có thể giải thích tại sao không?

Trả lời

25

%s chỉ ra một char*, không phải là một std::string. Sử dụng s.c_str() hoặc tốt hơn vẫn sử dụng, iostreams:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string s("bla"); 
    std::cout << s << "\n"; 
} 
+0

Tôi đã thử nó với std :: cout và trình biên dịch phát ra lỗi: nhị phân '<<': không tìm thấy toán tử nào có toán hạng bên phải của loại 'std :: string' – user429400

+0

Điều đó rất lạ. C++ thực hiện cái này là gì? – pjc50

+0

Tôi đã sửa đổi mã để được tự chứa và compilable (và thử nghiệm). –

18

Bạn cần sử dụng c_str để nhận chuỗi c tương đương với nội dung chuỗi là printf không biết cách in đối tượng chuỗi.

string s("bla"); 
printf("%s \n", s.c_str()); 

Thay vào đó bạn chỉ có thể làm:

string s("bla"); 
std::cout<<s; 
+1

Cảm ơn ... btw - tại sao? printf không biết làm thế nào để xử lý chuỗi? Có phương pháp nào khác mà tôi có thể sử dụng không? – user429400

+0

Tôi đã thử nó với std :: cout và trình biên dịch phát ra lỗi: nhị phân '<<': không tìm thấy toán tử nào có toán hạng bên phải của loại 'std :: string' – user429400

+0

printf không biết cách xử lý C++ std :: string s, nó hoạt động trên chuỗi c (mảng char với \ 0 để đánh dấu kết thúc chuỗi), lưu ý rằng vì khả năng tương thích ngược C++ C++ chuỗi chữ, tức là chỉ "bla" thay vì chuỗi s ("bla ") là chuỗi c và không phải là đối tượng của C++ std :: string class. –

1

tôi đã quản lý để in chuỗi sử dụng "cout" khi tôi chuyển từ:

#include <string.h> 

để

#include <string> 

Tôi muốn Tôi sẽ hiểu tại sao lại quan trọng ...

+1

Tôi cho rằng nhận xét này đã bị xáo trộn? – pjc50

+0

Từ 'include' đến' include'? Ý anh là gì ? –

+0

SO đã mangling bình luận của mình, tôi cố định nó bằng cách thêm số #. – egrunin

-1

Tại sao bạn không chỉ sử dụng

char s[]="bla"; 
Các vấn đề liên quan