2010-09-03 50 views
14

我想打印一個字符串方式如下:的「printf」亂碼

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

,但我得到的是這種隨機亂碼。

你能解釋一下爲什麼嗎?

回答

25

因爲%s表示char*,而不是一個std::string。使用s.c_str()或更好的使用,iostreams的:

#include <iostream> 
#include <string> 

using namespace std; 

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

我用std :: cout試過了,編譯器發出了一個錯誤: 二進制'<<':找不到操作符找到'std :: string'類型的右操作數 – user429400 2010-09-03 10:21:00

+0

這很奇怪。這是哪個C++實現? – pjc50 2010-09-03 10:57:12

+0

我已將代碼修改爲自包含和可編譯(並經過測試)。 – 2010-09-03 11:18:43

18

您需要使用c_str才能獲得等同於字符串內容的c字符串,因爲printf不知道如何打印字符串對象。

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

相反,你可以這樣做:

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

謝謝...順便說一句 - 爲什麼? printf不知道如何處理字符串? 是否有另一種方法可以使用? – user429400 2010-09-03 10:18:30

+0

我試過它與std :: cout和編譯器發出一個錯誤:二進制'<<':找不到操作符,它需要類型'std :: string'的右操作數 – user429400 2010-09-03 10:22:23

+0

printf不知道如何處理C++ std :: string s,它在c字符串(字符數組用\ 0標記字符串結尾)上工作,請注意,由於向後兼容性C++ C++字符串文字,即只是「bla」而不是字符串s(「bla 「)是c字符串,而不是C++ std :: string類的對象。 – 2010-09-03 10:48:42

1

我已經成功地打印字符串中使用 「COUT」 當我從切換:

#include <string.h> 

#include <string> 

祝我會理解爲什麼它很重要...

+1

我覺得這個評論已經被破壞了? – pjc50 2010-09-03 10:57:54

+0

從'include'到'include'?你什麼意思 ? – 2010-09-03 12:30:57

+0

SO正在改變他的評論,我通過添加#來修復它。 – egrunin 2010-09-03 16:09:23

-1

爲什麼你不只是使用

char s[]="bla";