• 締切済み

scanfでの可変引数

こんばんわ。 C言語で簡単な支出計算プログラムみたいなのを作ったのですが、自分の思ったようなプログラムが書けません。 #include<stdio.h> int main(int argc,char *argv[]){ int i; int n1; int a1,a2; int sum=0; puts("計算する日数を入力してください。"); printf("日数:"); scanf("%d",&n1); for(i=1;i<=n1;i++){ printf("%d日目:",i); scanf("%d",&a1); sum+=a1; } printf("【%d日間の支出】:%d円\n",i-1,sum); } 実行結果は以下のようになります。 計算する日数を入力してください。 日数:2 1日目:100 2日目:200 【2日間の支出】:300円 このプログラムだと1日に1つの支出しか計算してくれません。 1日で入力できる支出を複数にしたいのですが、つまり下のように 計算する日数を入力してください。 日数:3 1日目:100,150 2日目:200 3日目:300,150,1000 【3日間の支出】:1900円 のようにscanfで入力した数値を可変個の値にしたいのですが、 どのように実現したらよいでしょうか? scanf("%d,%d"&a1,&a2);のように2つにしてれやば複数にはできますが 必ず2個入力しないとエラーになってしまいます。 調べた所va_listという可変引数リストが使えそうなのですが、 scanfでどのように使えばよいのかわかりません。 ご教授よろしくお願いします。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

細かい部分はともかく、 if (scanf("%d", &n) == 1) sum += n; while (scanf(",%d", &n) == 1) sum += n; とすればscanfで実現できませんか? あるいは上限が決まっているのであれば、 int n = scanf("%d,%d,%d", &n1, &n2, &n3); として、nの値によっていくつ入力されたかを知ることができます。

push-pop
質問者

お礼

確認が遅れてしまい申し訳ありません。 最初のアドバイスでもなんとかできましたが、 jactaさんの2行でもすんなりうごきました。 ifをこういう風に使うとは気づきませんでした。 勉強になります。 ありがとうございましたm(_ _)m

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

書式文字列はしょせん文字列でしかないので, 変数を使えば当然「実行時に変える」ことはできます. ただし, 今の場合は「どれだけ読み込めばいいのか」が結局わからないので scanf を直接使うことはできないという結論に変わりはありません. ちょっと変ではありますが, 「数値のあとの文字」を読み込んでその文字によって動作を変えることは可能です. つまり書式文字列として %d%c と指定すると数値のあとの文字をとることができますから, ループを組むことはできます.

すると、全ての回答が全文表示されます。
回答No.1

実行時に変えるのは無理でしょう。 どうやってもフォーマット文字列は変えられませんから。 日数と同じようにその日の入力数を取得してループさせるか、 文字列として読み込んで自分で切り分けるしかないのでは?

push-pop
質問者

お礼

ありがとうございます。 よく調べもせず、なんでもできると思ってたみたいです。 文字列として読み込んで切り分けて数値に変換させてみようと思います。

すると、全ての回答が全文表示されます。

関連するQ&A