2012-03-29 13 views
-1

でのprintfを使用して だ、私が得た: が文字列のためのprintfを使用する場合は、文字列

string key = "123"; 
printf("Value is %s \n", key); 

//出力は、次のとおりです。値が<ヌル>

ですが、私はこのようにそれを行う場合:

string key = "123"; 
printf("Value is: "); 
printf(key.c_str()); 

は、私が取得:

//出力は、次のとおりです。値は、私は

printfの%sの

と間違っていたので、何123

のですか?

ありがとうございます。

+1

文字列はchar *ではありません。 gccを使用している場合、警告を有効にすると、コンパイラは最初の呼び出しでランタイムエラーを起こします。 –

+0

問題は解決しましたが、私は興味があります。この場合、出力はなぜ「バリュー」ですか?なぜ他の何か? (私のコンピュータ上では、コンパイラはプログラムがクラッシュすると警告しています)。偶然ですが、 'key'の値はゼロバイトを指すポインタのように見えますか? –

+0

@MR Lister:最初のケースでは、出力はでしたが、それを入力しましたが、エディタは何とかそれを隠しました。私はちょうどそれを更新しました。 – olidev

答えて

4

std::stringはC++クラスです。

  1. printfが唯一のプリミティブ型(intdoublechar *、など)に対処する方法を知っている純粋なCの関数で、次のとおりですので、これは動作しません。
  2. printfは、variadic functionです。バリアント関数にクラス型を渡すと、の定義されていない動作になります。

あなたは文字列を表示したい場合は、std::coutを使用します。

std::cout << key << "\n"; 

あなたは、単に、これは動作するはずです、printfを使用する必要がある場合:

printf("%s\n", key.c_str()); 

c_strですCスタイルの文字列を返すメンバ関数(つまり、const char * )。それにはいくつかの制限があることを覚えておいてください。あなたは、変更またはc_str()を呼び出し、その結果を使用しての間で-stringオブジェクトを削除することはできません。

const char *p = key.c_str(); 
key = "something else"; 
printf("%s\n", p); // Undefined behaviour 


1。または、おそらく実装定義の、私は思い出しません。いずれにせよ、それはうまく終わらないだろう。

+0

ありがとうございます。 std:coutも動作しますが、printfを使ってグローバルにしたいと思います。 – olidev

+1

@devn:「グローバル」とはどういう意味ですか? 「Cで働いている」という意味なら、そこで止めてください。 'string'はC++のみです。 –

+0

私はC#プログラマーです。私はC++/CLIで何かをやっています。そのC++プロジェクトでは、Coutの代わりにprintfをどこでも使用していると指摘しているので、C言語には多くのものが含まれています。したがって、私もprintfも使用するべきです – olidev

3

トークン%sは、const char*のヌル終了を期待し、std::stringとしています。

正しい方法は次のようになります。

printf("Value is %s \n", key.c_str()); 

C++の方法はstd::coutを使用することです。

+0

あなたは正しいです!それは動作します – olidev

+1

私はこの問題を見たたびにペニーがあった場合、私は少なくとも1ドル持っていたでしょう。 –

+1

ちょうどニットですが、 '%s'は' printf'に 'char const *'を期待しています。 (しかし、 'char *'を渡すこともできます。標準では、cv-qualificationsだけが異なるポインタ型の間で明示的に型をとることができます。) –

2

printfはCライブラリ関数で、%s形式のC "string"(char *)が必要です。あなたは既にこれを得るためにcppstring.c_str()を実行できることを発見しました。 this questionも参照してください。 printfは可変引数関数であり、あるクラスタイプのオブジェクトを渡す:

2

CスタイルはC++スタイルは他の回答に加えて

cout << "Value is %s " << key << endl; // cout can use std::string directly 
+0

あなたは私にCとC++スタイルの違いのより良い見方をもたらしてくれたことは素晴らしいことです。どうもありがとう! – olidev

1

あろう

printf("Value is %s \n", key.c_str()); // printf does need a nullterminated char* 

あろうPODは未定義の動作ではなく、std::stringはPODではないクラスタイプです。未定義の動作とは、何かが起こる可能性があることを意味しますが、これは検出が容易であり、良いコンパイラは少なくともエラーについて警告します。

0

cout < <文字列クラスのbacasueは、演算子 "< <"をオーバーロードしていますので、printf()は動作しません。

+0

申し訳ありませんが、私はちょうど今、文章ミスをしました。 –

関連する問題