ホームページ > バックエンド開発 > C++ > 「printf」が「std::string」で予期せぬ動作を引き起こすのはなぜですか?それを修正するにはどうすればよいですか?

「printf」が「std::string」で予期せぬ動作を引き起こすのはなぜですか?それを修正するにはどうすればよいですか?

DDD
リリース: 2024-12-31 13:01:11
オリジナル
689 人が閲覧しました

Why Does `printf` Cause Unexpected Behavior with `std::string`, and How Can I Fix It?

std::string での printf の使用について理解する

std::string は std 名前空間のメンバーであるにもかかわらず、printf で使用しようとすると予期しない結果が発生します次のコード スニペットに見られるように、この動作は次のとおりです。

#include <iostream>
#include <string>

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);
    cin.get();

    return 0;
}
ログイン後にコピー

この問題は、printf がタイプセーフではなく、C スタイルの文字列に依存します。これを解決するには、いくつかの方法があります。

std::cout を使用する

std::string は演算子のオーバーロードをサポートしているため、std::cout:

std::cout << "Follow this command: " << myString;
ログイン後にコピー
C スタイルの文字列を抽出しています

C スタイルの文字列を抽出する場合、必要に応じて、c_str() メソッドを使用して、null で終了する const char *:

printf("Follow this command: %s", myString.c_str());
ログイン後にコピー
可変個引数テンプレートの使用

または、可変個引数テンプレートを使用して、タイプセーフな代替手段を提供できます。プリントフ。実装例は https://stackoverflow.com/a/15014001 にあります。 Boost は、boost::format と同様の機能を提供します。

C 23 Update

C 23 では、両方のアプローチの長所を組み合わせた std::print が導入されており、 std::format:

を使用したタイプセーフな出力

以上が「printf」が「std::string」で予期せぬ動作を引き起こすのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート