当たり前かと。
まずコードを読みましょう。コードを読むコツは一行レベルで、その行が何をしているか考えながら読むです。
C
1#include <stdio.h>
2int main(void){
3 // 変数宣言部
4 int i, n;
5 char buf[1000];
6 char token[3][100];
7
8 // コンソールから一行読み込む
9 fgets(buf, sizeof(buf), stdin);
10 // 整数に変換する
11 sscanf(buf, "%d\n", &n);
12 // コンソールから二行目を読み込む
13 fgets(buf, sizeof(buf), stdin);
14 // 以下をn回繰り返す
15 for (i=0; i<n; i++) {
16 // 整数に変換する
17 sscanf(buf, "%s \n", token[i]);
18 }
19 // 結果を表示する
20 printf("[0] = %s , [1] = %s ,[2] = %s \n" ,token[0] ,token[1],token[2]);
21 return 0;
22}
これを疑似コードにしてみる。
0. 変数宣言
1. コンソールから一行読み込む
2. (1)を整数に変換する
3. コンソールから二行目を読み込む
4. 以下をn回繰り返す( n = (2) )
4.1. (3)の文字列を 半角スペースまでのデータを整数に変換する
5. 取得したデータを出力する
この疑似コードを使ってシミュレーションしてみる。実際にデータを入れて計算してみましょう。
入力値は
だとすると、(1)で「"3"」が入力されていますから、(2)でそれを整数に変換する。
すると n = 3 となるはずです。
(3)で読み込まれてbuf = "3 4 5" となりますね。
ここまではいいです。
そして(4)で「n回繰り返す」なので n = 3 、つまり 3回繰り返すことになる。
でも(4.1)では「bufを半角スペースまでのデータを整数に変換する」ですが、bufの値って何でしょうか?
buf = "3 4 5" だったはずです。
では、(4)~(4.1)をやってみましょう。
"3 4 5" の 半角スペースまでを一つの整数として取得すると 3が取り出せますね。
そして(4)に戻って条件式が満たされているかどうか試して二回目を行う。
(4.1)に行って、"3 4 5" で 半角スペースまでを一つの整数として取得する。
そうするとやっぱり3が取り出されますね。
三回目も同じようになる。
そうなるとやっぱり { 3, 3, 3 } となってしまいますね。
(4.1)で処理するときに「先頭から見ている」ためやはりどうしても最初の3しか取り出せませんね。
現実世界で"3 4 5" みたいな数列を見たとき同じような処理をするならどうしますか?
私ならまず一つ目の3を読んで、3のところに斜線なりを引いてチェック済みであることを示し、「半角スペースの次から見る」と思います。それを実装すればいいかと。