[解決済み] printf with std::string?
質問
私の理解では
string
は
std
という名前空間がありますが、なぜ次のようなことが起こるのでしょうか?
#include <iostream>
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;
}
<イグ
プログラム実行の都度
myString
は、上の出力のように、一見ランダムに見える3文字の文字列を表示します。
解決方法は?
コンパイル中の原因
printf
は型安全ではありません。C言語の意味での変数引数を使用しているからです。
1
.
printf
にはオプションがありません。
std::string
C スタイルの文字列のみです。期待されるものの代わりに何か他のものを使っても、間違いなく望む結果は得られないでしょう。実際には未定義の動作なので、どんなことでも起こりうるのです。
C++を使用しているので、これを解決する最も簡単な方法は、普通に印刷することです。
std::cout
というのは
std::string
は演算子のオーバーローディングによってそれをサポートしています。
std::cout << "Follow this command: " << myString;
何らかの理由でC言語風の文字列を抽出する必要がある場合は
c_str()
のメソッドを使用します。
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の時点ですべての主要なコンパイラでサポートされています)を見てください。その1つの例として
ここで
. 標準ライブラリにはそのような実装はありませんが、Boostにはあるかもしれません、具体的には
boost::format
.
[1]: これは、引数をいくつでも渡すことができるが、関数はそれらの引数の数と型を教えてくれることを頼りにしている、ということです。の場合は
printf
のような型情報をエンコードした文字列を意味します。
%d
意味
int
. 型や数を偽っても、関数はそれを知る標準的な方法を持ちません。ただし、コンパイラによっては、嘘をついたときにチェックして警告を出す機能を備えているものもあります。
関連
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] printf/String.Formatに相当するJavaScriptの機能
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] sprintfのようなstd::stringの書式設定