为什么C++中给printf的%s传返回string的函数会抛出错误?
报错原因
printf是从C语言继承来的可变参数函数,仅支持传递POD(Plain Old Data,普通旧数据)类型的参数,std::string是C++标准库的类类型,属于非POD类型,不允许直接传递给可变参数函数。printf的%s格式符要求传入的参数是C风格字符串(即const char*类型的指针),直接传入std::string对象类型完全不匹配,因此触发编译报错。
修复方案
有两种常用修复方式:
方案1:调用c_str()方法(编译器已给出提示)
std::string提供了c_str()成员方法,会返回字符串对应的C风格const char*指针,刚好匹配%s的要求,仅修改printf调用行即可:
printf("%.1f + %.1f = %s \n", 5.22, 4.66, addNum(5.22, 4.66).c_str());
注意:
c_str()返回的指针生命周期和对应的std::string对象一致,此处addNum返回的临时字符串对象会在整条printf语句执行完成后才销毁,调用是安全的。
方案2:改用C++标准输出流cout
cout原生支持std::string类型的输出,不需要手动做类型转换,适配性更好。
首先需要引入<iomanip>头文件用于控制输出精度,然后将main中的输出逻辑替换为:
cout << fixed << setprecision(1) << 5.22 << " + " << 4.66 << " = " << addNum(5.22, 4.66) << endl;
内容的提问来源于stack exchange,提问作者Souvik Ray
相关产品推荐
相关产品推荐

