【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++】fgetsを使ってファイルを読み込む

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

記事を読む

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

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

記事を読む

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

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

記事を読む

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

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

記事を読む

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

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

記事を読む

【C++】vectorの解放

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

記事を読む

【C言語/C++】はてなの演算子の三項演算子について

C言語などのサンプルにたまに出てくるはてな(?)の演算子は 『?』と『:』の2つで1つの演算子であ

記事を読む

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

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

記事を読む

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

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

記事を読む

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 ↑