它之所以编译是因为printf
类型安全,因为它使用的是C意义上的变量参数1。printf
没有选项std::string
,只有C样式的字符串。使用其他东西代替期望的东西绝对不会给您想要的结果。这实际上是不确定的行为,因此任何事情都可能发生。
由于使用的是C ++,解决此问题的最简单方法是使用正常打印std::cout
,因为std::string
它通过运算符重载来支持:
std::cout << "Follow this command: " << myString;
如果由于某种原因需要提取C样式的字符串,则可以使用的c_str()
方法std::string
来获取以const char *
空值结尾的。使用您的示例:
#include <iostream>
#include <string>
#include <stdio.h>
int main()
{
using namespace std;
string myString = "Press ENTER to quit program!";
cout << "Come up and C++ me some time." << endl;
printf("Follow this command: %s", myString.c_str()); //note the use of c_str
cin.get();
return 0;
}
如果您想要一个类似的函数printf
,但键入安全,请查看可变参数模板(C ++ 11,自MSVC12起所有主要编译器均支持)。您可以在这里找到一个示例。我对标准库中的实现一无所知,但具体来说,在Boost中可能没有boost::format
。
[1]:这意味着您可以传递任意数量的参数,但是该函数依赖于您告诉这些参数的数量和类型。在的情况下printf
,这意味着带有编码类型信息的字符串,如%d
含义int
。如果您撒谎是关于类型或数字,则该函数没有标准的知道方式,尽管有些编译器可以在撒谎时进行检查并发出警告。