printf()等で使用されている可変型の引数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ブレトン
記事: 3
登録日時: 12年前

printf()等で使用されている可変型の引数について

#1

投稿記事 by ブレトン » 12年前

printf()のような可変引数をもつ関数をラッピング(って言うのでしょうか?)をしたいのですが上手くいきません。

(DXライブラリで書いてたのですがコードが長すぎるので、コンソール用の簡単なサンプルを作りなおしました。)

コード:

#include <stdio.h>
#include <windows.h>
//<windows.h>はSleep()を利用するためのものです。

int printf2(const char *format, ...)
{
	printf(format);
}

int main(void)
{
	//◆本文のみで2番目以降の引数なし
	printf2("私の戦闘力は53万です\n") ;

	//◆引数が2つ以上の場合
	printf2("私の戦闘力は%d万です\n",53);

	Sleep(10000);	//コンソールがすぐに閉じないよう10秒待機
	return 0;
}
■■■↓実行結果↓■■■
私の戦闘力は53万です
私の戦闘力は1638216万です


オリジナルのprintf()関数で実行したら2行目も、1行目と全く同じ結果になるのですが、
作ったprintf2()関数を使うと、2行目は、どこか不明のアドレスから数値を引っ張り込んできたように思います。

何がやりたいかというと、printf2()関数でもprintf()関数と全く同じ結果を出したいのですが、やり方がわかりません。
可変の引数を持つ関数の引数を、そのまま別の関数に受け渡しするのはややこしいのでしょうか?

アバター
a5ua
記事: 199
登録日時: 14年前

Re: printf()等で使用されている可変型の引数について

#2

投稿記事 by a5ua » 12年前

可変長引数リストを処理するvprintf関数を使うとできます。
可変長引数リストを取得するには、va_startマクロを使います。

コード:

int printf2(const char *format, ...)
{
	int ret;
	va_list args;
	va_start(args, format);
	ret = vprintf(format, args);
	va_end(args);
	return ret;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: printf()等で使用されている可変型の引数について

#3

投稿記事 by softya(ソフト屋) » 12年前

a5uaさんの言われる通り、そのままprintfを呼び出すことは出来ません。
「C言語関数辞典 - vprintf」
http://www.c-tipsref.com/reference/stdio/vprintf.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ブレトン
記事: 3
登録日時: 12年前

Re: printf()等で使用されている可変型の引数について

#4

投稿記事 by ブレトン » 12年前

a5uaさん、softya(ソフト屋) さん、返信ありがとうございます。

実は最初の投稿前に、検索してva_startとか、va_listとかもしかしたらこれかな?というのは見つけてはいたのですが、
これを本当に使うのか、使うとしたらどう使えばいいのか、あまり理解できなかったのでスレッドに投稿した次第でした。
ありがとうございました^^

閉鎖

“C言語何でも質問掲示板” へ戻る