【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言語/C++】ファイルをCSV形式でfprintfを使って保存・書き込みする

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

記事を読む

【C++】行列演算ライブラリEigen

デフォルトのCやC++には行列やベクトルなどの演算ライブラリはありません。なので行列計算などをしよう

記事を読む

【C言語】fopenが失敗するエラー

ファイル操作に使うfopenがどうしても失敗してしまい困っていました。既に開かれているファイルを開く

記事を読む

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

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

記事を読む

【C言語/C++】余りを求める剰余演算子(%)を使う

基本的なことかもしれませんが、C言語やC++などであまりを出すには剰余演算子である『%』を使います。

記事を読む

no image

【C++】文字列のcontainsメソッドによる比較

C++/CLIなどではStringのContainsメソッドが便利ですが、純粋なC++のstring

記事を読む

no image

【C++】既に main.obj で定義されています

error LNK2005: 既に main.obj で定義されています。 fatal error

記事を読む

【C言語/C++】配列のまとめ

C/C++を使っていると必ず配列を使う場面が出てくると思いますが、その配列についてまとめました。C言

記事を読む

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

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

記事を読む

【C++】ファイルの読み込みまとめ

C++におけるファイル読み込みのまとめ ファイルの開き方 値の取得方法 >>演算子

記事を読む

【Laravel5】既存のDBからデータを取得して表示する

はじめに 今まで作ったWebサイトをLaravel5で見れるようにし

【C++/OpenCV】cv::Matの画像にインパルスノイズを付加する

OpenCVで画像にノイズを付け足したいと思って調べたところ、Pyth

Intel Corei7-7700TでHTC Viveの動作確認

はじめに HTC ViveというVRヘッドセットで遊んでみたのでその

【Python】フォルダ内のカッコ付き数字ファイルを一括でリネームするスクリプト

はじめに タイトルどおりなのですが、指定フォルダ内のファイルのファイ

OpenCV3.1のTracking APIでトラッキングを試す

はじめに 先日OpenCV3.1をopencv_contrib付きで

パソコンを複数台使う際便利なツール

はじめに 先日、機械学習用にGPUを積んだBTOパソコンを購入しまし

OpenCV3.1をopencv_contrib付きでVisual Studio2013でビルドしてインストールする

はじめに OpenCV3.1でトラッキングがしたいと思いインストーラ

→もっと見る

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