结论:
printf("%s", str.c_str());
因为printf里面要求是char*类型,string和char*是不一样的
近期研究设计模式,在程序输出时心血来潮用了c版本的printf,结果就蛋疼了,一直输出是乱码,
string s = "中国";
printf("%s" , s);//输出乱码
于是果断切换成c++版本的cout发现可以正常输出。于是上网找答案,居然惊讶的发现printf输出字符串是针对char *的,换言之,printf只能输出C语言中的内置数据,string不是C语言内置数据。更深入的来说:s这个string类型的对象并非单单只有字符串,其内还有许多用于操作的函数,于是&s并非字符串“中国”的首地址,而是s这个对象的首地址。
所以要做如下操作:
string s = "中国";
printf("%s" , s.c_str());//string中c_str()成员方法返回当前字符串的首字符地址
或cout<<s;//string中重载了“<<”操作符
上面的内容是我摘录别人的回答思路。我自己遇到的问题是:在VC++中使用MFC的控制台程序中使用printf输出string类型的中英文数据均正常,但是我从MSSQL数据库(数据库为:sql server 2008 r2)中获取的数据输出时出现乱码,经过跟踪发现从数据库得到的数据是正常的,但是用printf格式化后向控制台输出时出现乱码,换成cout输出使用显示均正常。经过调查即上面提到的解释,使用string的c_str()函数转换后进行正常输出,看来上面的说法解释不假,再此得到了验证。