パソコン活用研究シリコンバレー(C、C++、の活用研究)

標準入力の小技 〜分割して入力

(準備中)
------------------------------------------------------------------------------
getsで1行読み込んだ後に区切り記号で分割
------------------------------------------------------------------------------


読み込むデータ数が決まっていない時は,
getsで1行読み込み以下の方法で分割して読み取ります。

Cには読み込んだ1行を区切り記号で分割してトークン化するための関数がないので、
strtok関数で1個づつ読み込んでいきます。

strok関数
char strok(char* str1, const char* str2)

第一引数 str1 文字列
第二引数 str2 区切り文字

戻り値は、分割ができた場合、分割した文字列の先頭アドレスが返ります。
分割できなかった場合はNULLが返ります。

例えば、getsで1行読み込み、空白を区切り記号として分割したいときは、
char str{256], *token;
gets(str);
token=strok(str, " ");
のように書きます。

これで最初の分割した文字を取得しますが、2個目以降を取得する場合の
strok関数の書き方は少し注意が必要です。
続けて2個目以降の分割した文字列の取得を行う時は、第一引数ぬにNULLを指定します。
strok(NULL, " ");


(参考)なお、VB.netやPythonでは、読み込んだ1行を一気に分割するsplit()というメソッドが用意されています。
それぞれ以下のページをご参照下さい。
VB.net 〜 標準入力の小技(分割して入力)
Python〜 標準入力の小技(分割して入力)


空白区切りで文字列を分割

<split0.c>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char s[30],*token;
gets(s);
token=strtok(s," ");
while(token != NULL) {
printf("%s\n",token);
token=strtok(NULL," ");
}
return 0;
}


実行例

c:\bcc55\Bin>split0
This is a book
This
is
a
book





カンマ区切りで数字を読み込み、整数に変換してそれらの数値の総和を求める。

<split2.c>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int sum;
char s[30],*token;
gets(s);
sum=0;
token=strtok(s,",");
while(token != NULL) {
sum=sum+atoi(token);
token=strtok(NULL,",");
}
printf("%d\n",sum);
return 0;
}


c:\bcc55\Bin>split2
1,5,10,50
66

c:\bcc55\Bin>






TopPage