scanfを使う場合、一項目ずつ読み込むというかたちにすることで要望をかなえることができると思います。以下のコードは、空白で区切られた文字列をEOFが出現するまでひたすら読み出すコードです。
C
1#include <stdio.h>
2
3int main() {
4 char buf[256];
5 int num = 0;
6
7 for (;;) {
8 int ret = scanf("%s", buf);
9 if (ret == 1) {
10 /* 正しく1つ分、入力された */
11 ++num;
12 printf("%d: %s\n", num, buf);
13 } else if (ret == EOF) {
14 /* EOFなので入力終了 */
15 break;
16 }
17 }
18
19 printf("\ndone. num=%d\n", num);
20 return 0;
21}
このプログラムを実行してみます。
sh
1
2$ gcc -Wall -o t1 t1.c
3$ ./t1
4item1
51: item1
6item2 item3
72: item2
83: item3
9item4 item5 item6 item7
104: item4
115: item5
126: item6
137: item7
14item8
158: item8
16item9 item10
179: item9
1810: item10
19
20done. num=10
21$
データを格納したテキストファイルをあらかじめ用意して、標準入力のリダイレクトを利用して実行した例です。(こちらの方が何が起こっているか分かりやすいかもしれません)
sh
1$ cat data.txt
2item1
3item2 item3
4item4 item5 item6 item7
5item8 item9
6item10
7$ ./t1 < data.txt
81: item1
92: item2
103: item3
114: item4
125: item5
136: item6
147: item7
158: item8
169: item9
1710: item10
18
19done. num=10
データが文字列であったり数値であったりする場合は、データの出現順に合わせて適時、atoiやstrtolなどの標準関数を利用して変換処理を行う必要があるでしょう。
その他、AtCoderなどの競技プログラミングでは標準入力で外部データの取り込みをすることが多いので、そういった情報も併せて検索してみると多くのヒントが得られるかとも思います。
2020/07/26 09:42