みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語で数値の受取

C言語で横に並んだスペース区切りの数値を受取り配列に収めたいたいのですがどうしたらいいでしょうか?
入力:3 4 5
scanf("%d %d %d", &a, &b, &c);
の様にしたいのですが受け取る数値の数はその都度変わります。

よろしくお願いします。

投稿日時 - 2018-02-22 17:31:22

QNo.9431630

困ってます

質問者が選んだベストアンサー

fgetsして、strtokして、atoiする

strtokのサンプル。
#include <string.h>
#include <stdio.h>
main ()
{
char text[] ="12 34 56 7";
char *p;
char *q;
char dlm[] = " ";

p = text;
while( q=strtok(p,dlm) ){
printf("%d\n", atoi(q));
p=NULL;
}
}

投稿日時 - 2018-02-22 23:01:03

お礼

ありがとうございました

投稿日時 - 2018-02-23 11:00:19

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

 数字の個数が変わるのであれば、自分で、行の内容を解析していくしかありませんね。
 いずれにせよ、例えば、「1,2,3,4」とか、「1a2a3a4a5だよ」とかおかしな入力の処理も必要ですから、scanf一発で入力から離れた方が良いでしょう。
 一番簡単なのは、
while( (ch=getc(fh)) != EOF)
 で、一文字ずつ入力し、chが数字か、区切り文字か不正な文字かを判定し、
数字なら、前回読み込みの数字を10倍して今の数字を足す。区切り文字なら、数字の配列を進める、不正文字ならエラー処理をする。
 というのをループで回すのが素直でしょうか。
 これなら、区切り文字が空白だけとは限らず、「,」でも「;」でも、それらが混じっても良いとするのでも、解釈次第で好きなように処理できます。
 文字から、数字への変換は、atoiを使用すれば良いでしょう。
chを char ch[2]; と宣言し、ch[1]=null; で初期化しておき、while文中のchをch[0]としておけば、suuji = suuji*10+atoi(ch); で、片が付きます。

投稿日時 - 2018-02-22 21:11:59

お礼

ありがとうございました

投稿日時 - 2018-02-23 11:00:03

あなたにオススメの質問