【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
  • このエントリーをはてなブックマークに追加

関連記事

no image

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

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

記事を読む

【C言語/C++】配列をシャッフルしてランダムに入れ替える

C言語・C++で配列をシャッフルする方法 Fisher–Yatesシャッフルアルゴルズムにより配列

記事を読む

【C言語/C++】fgetsを使ってファイルを読み込む

fgetsで単純にファイルを読み取る C言語、C++でfgetsを使ってファイルを読み込む方法です

記事を読む

【C++/CLI】フォームアプリケーションでコンソール画面を出現させる

プロジェクトのプロパティを開いて「構成プロパティ」→「リンカ」→「システム」の「サブシステム」を「コ

記事を読む

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

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

記事を読む

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

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

記事を読む

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

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

記事を読む

【C言語/C++】フォルダ作成を行う

C言語、C++でフォルダを作成するには『direct.h』にある『_mkdir』関数を使うことで実現

記事を読む

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

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

記事を読む

OpenCVで矢印を描画する

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

記事を読む

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

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

【PHP】headerでContent-Typeを指定したのに効かない場合の対処法

PHPでサイトマップを作ろうと思い、XML形式のファイルを出力しようと

スマホ向け幅固定サイトの回転時の幅対応方法

幅固定サイトでのスマホ回転時Webサイトの横幅を合わせる方法のメモ。

【PHP】特定のURLからそのAtomやRSSのフィードを抽出する方法

特定のURLからRSSやATOMのフィードを抽出する方法をメモ。 流

フィード抽出ツール(RSS1.0、RSS2.0、atom)

任意URL サイト名 サイトURL RSS1.0

格安プラン限定レンタルサーバー機能比較表(2016年)

はじめに  最近新しい共用サーバーをレンタルしようと思い調査およびそ

kindle unlimitedが便利だったのでお勧めの使い方など感想メモ

 kindle unlimitedというサービスが8/3からAmazo

→もっと見る

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