ホームページ >バックエンド開発 >C++ >printf が std::string で直接動作しないのはなぜですか? 代替手段は何ですか?

printf が std::string で直接動作しないのはなぜですか? 代替手段は何ですか?

DDD
DDDオリジナル
2024-12-18 13:31:10236ブラウズ

Why Doesn't printf Work Directly with std::string, and What Are the Alternatives?

std::string で printf を使用する方法

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。