• ベストアンサー

引数が可変する場合の書き方

printf関数みたいに、引数が時と場合によって変化するような書き方のサンプルコード、教えてください。 stdio.hのprintfには printf( const char* string, ... ); みたいなのが書いてあったのですが、この、 ... って、何がどうなっているのか知りたいです。 是非、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • grape16
  • ベストアンサー率55% (52/93)
回答No.3

No.1で示した参考URLは古い仕様のCなので,別の参考URLも示しておきます。 Programing Place http://www.geocities.jp/ky_webid/ 可変個の引数 http://www.geocities.jp/ky_webid/c/057.html

参考URL:
http://www.geocities.jp/ky_webid/c/057.html

その他の回答 (5)

noname#11920
noname#11920
回答No.6

「どう」とは、何を知りたいのでしょうか? とりあえず、簡単に原理を説明しておくと、 例えば引数を持つ関数 f(A, B, C, D) があったとしましょう。(型は書きませんでしたが) それで、呼出もとで f(a, b, c, d) と書いた場合、スタックにa, b, c, dの値が逆の順に格納されて、 その上で関数f()のコードが呼び出されます。 因みにスタックとは、プログラムに必要なデータを格納するメモリ上の領域のことです。 Cのコードで int foo(void) { int a; } と書いたとき、aは実はスタック上に作成されます。 そしてスタックでは、入れたときとは逆の順番に値が取り出されます。 たとえば、10, 11, 12と順番に値をスタックに入れたら、 取り出すときは12,11,10の順になります。 さて関数fの内部に処理が移ると、 まず最初に、スタックの最後尾のアドレスを参照します。 つまり、上の例では値aのスタック上のアドレスです。 これを仮引数Aの値に対応させます。 そして、スタックのaのひとつ前、つまりbの値をBに対応づけます。 これを応用して、引数にはスタックの最後尾のアドレスのみを渡すようにして(引数としては最初の引数)、 必要な時にスタックを先頭方向へ順番に辿って行き、 引数の数を明確にしない状態で関数を定義したものが、 可変個引数関数です。 その代表例がfprintfです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

過去にOKWebででたサンプル? 色々と参考になると思う

参考URL:
http://okweb.jp/kotaeru.php3?qid=1250154
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

こういう扱い方をします。 #include <stdio.h> #include <stdarg.h> int printf(const char *string, ...) {  va_list ap;  int result;  va_start(ap, string);  result = vfprintf(stdout, string, ap);  va_end(ap);  return result; }

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

vararg.hかstdarg.hを使います。使い方はヘルプを見てください。 それから、お使いのコンパイラによってはライブラリ関数のソースファイルが付属しているので、もし付属しているようであればそれを併せて見てみると分かりやすいと思います。(Microsoft Visual C++であれば付属しています。他はちょっと分からないのですが。)

  • grape16
  • ベストアンサー率55% (52/93)
回答No.1

参考URLはいかがでしょう? http://www.ncad.co.jp/~komata/c-kouza4.htm

参考URL:
http://www.ncad.co.jp/~komata/c-kouza4.htm