std::string で printf を使用するときに混乱するのは当然です。 string は std 名前空間のメンバーであるため、これらはシームレスに連携するはずだと思われるかもしれません。ただし、printf の型安全でない性質のため、これは当てはまりません。
Printf は C の意味で可変引数を使用します。つまり、任意の数の引数を渡すことができますが、それを伝えるのはユーザーに依存します。それらの引数の数と型。 printf の場合、これは、int の %d など、エンコードされた型情報を含む文字列を通じて行われます。引数の型や数について嘘をついた場合、関数にはそれを知るための標準的な方法がなく、未定義の動作を示します。
タイプセーフな C 構造である std::string では、printf にはオプションがありません。 C スタイルの文字列のみです。期待されるものの代わりに他のものを使用しても、確実に望ましい結果は得られません。
この問題の簡単な修正は、std::cout を使用して通常どおり出力することです。これは、std::string が演算子のオーバーロードをサポートしているためです。目的:
std::cout << "Follow this command: " << myString;
何らかの理由で C スタイルの文字列を抽出する必要がある場合は、std::string の c_str() メソッドを使用して取得できます。 null で終わる const char *。 c_str() を使用した更新された例を次に示します。
printf("Follow this command: %s", myString.c_str()); // note the use of c_str
printf と同様に動作するタイプセーフ関数の場合は、可変長引数テンプレート (C 11 で導入) の使用を検討してください。その例は [ここ](https://en.cppreference.com/w/cpp/utility/variadic) で見つけることができます。さらに、Boost は、boost::format と呼ばれる潜在的に役立つライブラリを提供します。
以上がprintf が std::string で直接動作しないのはなぜですか? 代替手段は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。