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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

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

#1

投稿記事 by shiro4ao » 10年前

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;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

インラインアセンブラを用いて「いい感じ」に引数のデータを
スタックorレジスタ(レジスタに引数を積む環境の場合)に置いてsprintf(に相当するラベル、_sprintfとか?)をcallするか、
もしくはvsprintf関数が使えるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#3

投稿記事 by h2so5 » 10年前

標準入力からなら全部文字列なので、フォーマットにしたがって文字列を連結する関数を作ればいいと思います。
わざわざsprintfを使うほうが面倒では?

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

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

#4

投稿記事 by shiro4ao » 10年前

>みけCATさん
ありがとうございます
インラインアセンブラを使うのはちょっと骨が折れそうなので
vsprintfを調べてみようと思います

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

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

閉鎖

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