質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1666閲覧

C 文字列と数値の入力について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/03/06 04:45

文字列と数値を続けて入力する時に

#include<stdio.h>

int main()
{
int a,b;
char str[10];
scanf("%s%d%d",str,&a,&b);
printf("%s %d %d",str,a,b);
}

のように決められた回数だけ、文字列なり、数値なりを入力できる事はわかるのですが、文字列によって
次に続ける数値の入力回数を変えるプログラムの仕方がわかりません。
例えば
strがABCの時、ABC 1 2
strがDEFの時、DEF 1 2 3
strがGHRの時、GHR 1
など、

上のプログラムだと、scanf("%s%d%d")で、ABC 1 2 のように、数値は二回だけの入力と固定されてしまい
ます。改行せずに、文字列によって、入力する数値の回数を変更できるプログラムを作り、入力された数値を
変数に格納して次の演算に利用できるようにしたいと思っています。
何かいい方法がありましたら教えてください!どうぞよろしくお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

題意のままの解答(文字列が先頭の1文字で判断できるとしていますが・・・)です。
(コンパイルは出来ています)
ただ通常はkazuchiさんが言うように、先頭の文字列を判断したあと後続のパラメタを解析するようにします。たとえば、先頭が'ABC'である事が分かったら、次のパラメタのポインタを処理対象に渡す。渡された方は、パラメータの解析が終わったら次のパラメータのポインタを返す・・・の繰り返しで処理が出来ます。

c

1/* 2 * 先頭の文字列によって読み込むパラメータを変える 3 */ 4#define BUF_SIZ 32 5// 6int main() 7{ 8 char buf[BUF_SIZ]; 9 char str[4]; 10 int a; 11 int b; 12 int c; 13 // 14 fputs("入力データ→ ", stdout ); // 画面出力 15 fgets( buf, sizeof buf, stdin ); // 文字列入力 16 // 17 switch( buf[0] ){ 18 case 'A': 19 sscanf(buf, "%s %d %d", str, &a, &b ); 20 // ここで処理を呼ぶ 21 break; 22 case 'D': 23 sscanf(buf, "%s %d %d %d", str, &a, &b, &c ); 24 // ここで処理を呼ぶ 25 break; 26 case 'G': 27 sscanf(buf, "%s %d", str, &b ); 28 // ここで処理を呼ぶ 29 break; 30 default: 31 fputs("パラメータが異常です!", stderr ); 32 break; 33 } 34 // 35 return 0; 36}

投稿2016/03/06 10:34

編集2016/03/06 10:42
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/07 04:52

具体的なプログラムやノウハウを教えていただきありがとうございます! fputs,fgets,sscanfなどの使い方が学べてとても勉強になりました! 今後のプログラムの参考にさせていただきます!
guest

0

>文字列によって、入力する数値の回数を変更できるプログラムを作り

あなたが考えたプログラムで上の動作をするプログラムを自作するしかありません
int main()
{
int a,b,c;
char str[10];
scanf("%s%d%d",str,&a,&b);
if(strcmp(str,"ABC")) scanf("%d%d",&a,&b);
if(strcmp(str,"DEF")) scanf("%d%d%d,&a,&b,&c);
printf("%s %d %d %d",str,a,b,c);
}

って感じですね。

投稿2016/03/06 05:35

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答してくださったみなさんありがとうございました!
scanf関数は汎用性があまりない事が学べました!
今後の参考にさせていただきます!

投稿2016/03/07 05:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

scanf() は基本的にエラー処理をほぼ考慮していない設計のため、
その場限りの使い捨てのプログラムを除いてはあまり使用をお勧めできません。

決め打ちで不都合が生じて

strがABCの時、ABC 1 2
strがDEFの時、DEF 1 2 3
strがGHRの時、GHR 1

といった汎用性が必要になってきたのであれば、scanf に依存しない方法を考慮すべき時期に来ているように思います。

また、こういった処理をするということは、読み取りだけでなく、
受け取る変数の数も str に対応して可変するようにする必要がでてきます。
そういった点も含め、

  • 入力するデータの書式
  • その書式に対応する Cプログラム上での変数の持ち方
  • 入力データをCの変数に変換していく処理

といった順を追って決めていく必要があると思います。

投稿2016/03/06 06:25

kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問