printfCの意味で可変引数を使用するため、タイプセーフではないため、コンパイルされます1。printfにはオプションがstd::stringなく、Cスタイルの文字列のみです。それが期待するものの代わりに何か他のものを使用しても、あなたが望む結果を確実に与えることはありません。これは実際には未定義の動作であるため、何でも発生する可能性があります。
C ++を使用しているため、これを修正する最も簡単な方法はstd::cout、std::string通じオペレータがオーバーロードしていることをサポート:
std::cout << "Follow this command: " << myString;
何らかの理由でCスタイルの文字列を抽出する必要がある場合は、のc_str()メソッドを使用してnullで終了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ます。タイプまたは数値について嘘をついている場合、関数には標準の知る方法がありませんが、一部のコンパイラーは、嘘をついたときにチェックして警告を出す機能を備えています。