2016-11-04 4 views
0

私はC(ポインタ、ポインタポインタなど、私はそれが大好き)で私の最初のステップをやっているので、これはばかげた質問の場合は慈悲を持ってください。C - snprintfの後に出力されない

このフラグメントの出力は何も:

char buf[256]; 
snprintf(buf, sizeof buf, "output: %s%s%s"); 

puts("test"); 

と、(予想通り)、このフラグメントを出力 "テスト":

char buf[256]; 
snprintf(buf, sizeof buf, "output: %s%s"); 

puts("test"); 

=>test 

質問:はsnprintfはここに役割を果たしているのでしょうか? puts-statementと関係がありますか?または、最初のコードにput/put/put /出力がないのはなぜですか? snprintf(buf, sizeof buf, "output: %s%s%s");は、3つのパラメータを必要と

+2

あなたの 'snprintf'呼び出しにパラメータがありません - あなたのコンパイラはこれについて警告しなければなりません(コンパイラの警告を有効にしていると仮定します)。あなたは[これらのうちの1つ](http://stackoverflow.com/q/562303/253056)を選んで少し読んでみたいかもしれません。 –

+1

さらに、sprintfとsnprintfはstdoutに何も印刷しません。eclipse cdtを使用して、 – Marco

+0

でバッファー(あなたの場合はbuf)に印刷します。コンパイラの警告が表示されません。どこかで設定を忘れた場合は、今すぐチェックしています –

答えて

1

ので:あなたは文句を言わないのsnprintfを意味するものではありません機能をsnprintfのためのパラメータを渡さない場合

snprintf(buf, sizeof buf, "output: %s%s", str1, str2);

snprintf(buf, sizeof buf, "output: %s%s%s", str1, str2, str3);

snprintf(buf, sizeof buf, "output: %s%s");は、2つのパラメータが必要ですそれらにアクセスしてみてください。したがって、存在しない "str3"パラメータにアクセスしようとするsnprintfが原因で、セグメンテーション違反の結果が表示されます。

+0

お返事ありがとうございます。しかし、私のテスト(成功と失敗)の両方で、少なくとも2つのパラメータが欠落しています。そのうちの1つでは、セグメンテーション・フォールトは発生しません。これはコンパイラの予測可能な動作ではありませんか?とにかく、関数を使用するときに関数を使用しないときは、そのような質問に対する合理的な答えはないと思うので、私はあなたの答えを受け入れます。 –

+2

予測できない振る舞いは、まさにこのようなエラーから期待するべきものです。これは未定義ビヘイビアと呼ばれます。 – chqrlie

+0

snprintfが最初の2つのパラメータにアクセスしようとすると、これらのパラメータは既存のページに存在します(snprintfはいくつかの迷惑を受け取りますが、プロセスに属するメモリから取得します)。あなたのプロセスに属していないか、存在しておらず、セグメンテーション違反をキャッチしています。他の言葉では、セグメンテーションフォルトが発生すると、割り振られたメモリページの迷惑情報に依存します(snprintfが/ 0 = EOLを検索するため)。 – nopasara

関連する問題