Cセンス1printf
で可変引数を使用するため、タイプセーフではないためコンパイル中です。のオプションはなく、Cスタイルの文字列のみです。期待するものの代わりに何か他のものを使用しても、あなたが望む結果は確実に得られません。これは実際には未定義の動作であるため、何かが発生する可能性があります。printf
std::string
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
ます。タイプや数値について嘘をついている場合、関数には標準的な方法がありませんが、一部のコンパイラには、嘘をついたときにチェックして警告を出す機能があります。