【C言語】printfのような関数を作る

公開日: : 最終更新日:2014/08/14 C/C++

スポンサーリンク

C言語でよくつかわれるprintfでは例えば

int a,b,c;
…
printf("%d,%d,%d\n",a,b,c);
printf("%d,%d\n",a,b);

のように文字列の後の引数をいくつも取ることが可能となっていますが、このような引数をを可変引数と呼ぶようです。このような可変引数を持つ関数を作るにはstdarg.hを使うことで可能となっています。

#include<stdarg.h>
#include<stdio.h>
void print(int size,...)
{
	va_list ap;
	//可変引数の先頭を記述
	//この場合はsize以降となる。
	va_start(ap,size);
	for(int i=0;i<size;i++){
		//可変部分の引数を型を指定して取り出す
		int num = va_arg(ap,int);
		printf("%d\n",num);
	}
	//処理の終了
	va_end(ap);
}
int main(void){
	print(3,4,5,6);
}
4
5
6

可変引数部分をコンソールに出力するという特に意味のあるサンプルではないですが、

可変引数部分は … と記述し、
va_listによって可変部分を管理
va_startによって可変部分の位置を指定
va_argによって可変部分の値を型を指定して取得
va_endによって可変部分の取得終了

を行っています。一つ問題なのは型が正確に決まっていないと駄目なようで、たとえばこの例だとintでなくdoubleを可変部分に入れるとちゃんとした値にならないです。(勝手にキャストしてくれない模様)

print(3,4.0,5.0,6.0f);
//結果(必ず0になるというわけではない模様。デタラメな値)
000

ところでprintfには引数の数を指定する必要はないのですが、これはおそらく第1引数の文字列を解析して得ており、引数の数は%の数、それに対応する型は%の後の文字で判断しているのだと思います。

スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

【C言語】fscanfでファイルを1行ずつ読み込む

C言語のfscanfでCSV形式(単純なカンマ区切り)のファイルを読み込むサンプル。 基本的なこと

記事を読む

【C言語】文字列に指定の文字列が含まれるか調べる

ある文字列に指定の文字列が含まれるかどうかを調べるにはstring.hにあるstrstr関数を使いま

記事を読む

【C言語/C++】関数の宣言・定義まとめ

1 関数プロトタイプ宣言・定義 1-1 プロトタイプ宣言 1-2 定義 2 ファイ

記事を読む

コンソールアプリケーションでC++/CLIの関数を使う

今時(?)なかなか使っている人がいるかどうかわかりませんが、VisualStudio(2008)で「

記事を読む

【C++】多次元ベクトルクラスを作る

3次元ベクトルクラスや2次元ベクトルクラスを作るときは内部のデータとして静的な配列を使えば問題ありま

記事を読む

【C++】vectorの解放

C++STLにあるvectorは配列の要素数がわからない場合などに非常に便利ですがメモリ関係で面倒だ

記事を読む

【C言語/C++】コンソールでAAアニメーション

コンソール上でAA(アスキーアート)のアニメーションをさせます。 手順としては

記事を読む

【C言語/C++】ファイルをCSV形式でfprintfを使って保存・書き込みする

数値計算などをC言語でプログラミングするとき、その演算結果をファイルとして保存する必要性がでてくるこ

記事を読む

OpenCVで矢印を描画する

OpenCVで矢印を描画するという関数が無いみたいだったので作りました。書いていることは参考リンク先

記事を読む

【C言語/C++】関数ポインタと関数オブジェクトを使ってみる

関数ポインタを使う 関数ポインタはポインタの一種で文字通り関数のポインタの事で、関数を遠隔操作でき

記事を読む

NVIDIA DIGITSをSupervisorを使って自動起動する

はじめに 先日Ubuntu14.04にDIGITS 5をGPUなしP

【2017年度】GeForce 1080 Ti搭載BTOパソコン比較

はじめに 最近ディープラーニング用にGPUのないPCにDIGITSを

Windows用のシンプルなストップウォッチソフト紹介

Windows(10)でも使える使いやすいKAZAMITimerという

MNISTをDIGITS 5のCPUのみで試す(GPUなし)

はじめに DIGITSを使えばGUI操作で簡単にディープラーニングが

Windowsユーザが初めてMacBookを購入したときの注意点や感想

最近12インチのMacBookを購入しました。今までWindowsしか

Redmine3.2をUbuntu14.04にインストールして躓いた所についてメモ

はじめに Ubuntu14.04 ServerにRedmine3.2

UWSCを使ったソフト自動立ち上げ【SoftEther VPN Server】

やりたいこと 最近SoftEtherという筑波大学発のベンチャー企業

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑