在c++里面使用printf輸出std::string字符串會(huì)出現(xiàn)一些問題,如下:
#include<bits/stdc++.h>
int main ()
{
std::string s ("This is an sentence.");
std::cout << s << std::endl;
printf("%s\n", s);
return 0;
}
output:
This is an sentence.
?
printf的結(jié)果是一個(gè)奇怪的字符,這是為什么呢?
這是因?yàn)?code>printf的"%s"對(duì)應(yīng)的是C-style string,不支持std::string,也就是說printf 不是類型安全的(isn't type safe)。正確的做法是使用std::cout << s << std::endl;。
而如果非要使用printf,有一個(gè)不是很推薦的做法,使用std::string.c_str()獲得const char *的字符串,然后再輸出。
#include<bits/stdc++.h>
int main ()
{
std::string s ("This is an sentence.");
std::cout << s << std::endl;
printf("%s\n", s.c_str());
return 0;
}
output:
This is an sentence.
This is an sentence.
至于為什么這種方法是不推薦的,參見:
https://stackoverflow.com/questions/10865957/c-printf-with-stdstring
補(bǔ)充:
同理,輸入字符串到
std::string的時(shí)候,不能用scanf("%s", &s);,而應(yīng)該用std::cin >> s;