ページ 11

sprintfの引数を実行時に与えたい

Posted: 2014年1月12日(日) 21:58
by shiro4ao
sprintfの第二引数以降をプログラムの実行時に例えば標準入力から得て
その書式、引数で文字を並べて欲しいのですがうまくつくれません

書式を実行時に決めるのは以下のコードで出来たのですが
引数の数が固定されてしまいます(下記の例だと3つに固定される)

この部分を自由な数だけ指定できるようにする方法はありますか?

コード:

#include <stdio.h>

int fsa(char *buf,char *format,char *a,char *b, char *c){
	sprintf(buf,format,a,b,c);
	return 0;
}


int main(){
	char buf[1024];
	char format[1024];
	char data[1024];

	printf("format->");
	gets(format);	

	fsa(buf,format,"1","2","3");
	printf("\n\n-%s-",buf);	

	return 0;	
}


試しに以下のように書き換えてformatへの引数を
%s %s %s ,"a","b","c"
としてみたのですが
€ ζ劫 ,"a","b","c"
という壊れたデータが出てきてしまいました

コード:

int fsa(char *buf,char *format,char *a,char *b, char *c){
	sprintf(buf,format);
	return 0;
}

Re: sprintfの引数を実行時に与えたい

Posted: 2014年1月12日(日) 22:26
by みけCAT
インラインアセンブラを用いて「いい感じ」に引数のデータを
スタックorレジスタ(レジスタに引数を積む環境の場合)に置いてsprintf(に相当するラベル、_sprintfとか?)をcallするか、
もしくはvsprintf関数が使えるかもしれません。

Re: sprintfの引数を実行時に与えたい

Posted: 2014年1月12日(日) 22:30
by h2so5
標準入力からなら全部文字列なので、フォーマットにしたがって文字列を連結する関数を作ればいいと思います。
わざわざsprintfを使うほうが面倒では?

Re: sprintfの引数を実行時に与えたい

Posted: 2014年1月13日(月) 20:23
by shiro4ao
>みけCATさん
ありがとうございます
インラインアセンブラを使うのはちょっと骨が折れそうなので
vsprintfを調べてみようと思います

>h2so5さん
sprintfをちょっと変えるだけかなと思ってたのですが
やっぱり自分でフォーマットにしたがって文字列を連結する関数を
作ったほうがいいのですね・・・
ありがとうございます

方針が立ったのでとりあえず解決とさせていただきます