回答編集履歴
4
コードミスを修正
test
CHANGED
@@ -52,7 +52,7 @@
|
|
52
52
|
```C
|
53
53
|
i = 0;
|
54
54
|
while (fscanf(fp, "%s", &words[i]) != EOF) {
|
55
|
-
printf("%s\n", words[i]); // 読み込んだ単語を表示する
|
55
|
+
printf("%s\n", &words[i]); // 読み込んだ単語を表示する
|
56
56
|
i++;
|
57
57
|
}
|
58
58
|
printf(" => %s\n", words); // words[] 配列の結果を表示する
|
3
図を追加
test
CHANGED
@@ -39,3 +39,27 @@
|
|
39
39
|
```
|
40
40
|
とすることを考えましたが、これでもまともに動くとは思えません。一見動いたように見えても、質問者が期待したようには動いていないでしょう。
|
41
41
|
siny[], words[] 等の **データ構造を見直し、その使い方も見直す必要がある**と思います。目的に合ったデータ構造を用意しないとまともな結果を出せません。
|
42
|
+
|
43
|
+
---
|
44
|
+
追加。
|
45
|
+
rewind() する必要はありません。fopen()直後はファイル先頭から読み出せます。
|
46
|
+
|
47
|
+
> 1行ごとに読み込んでいるのでそれごとにi++して1単語ずつ入れているつもり
|
48
|
+
|
49
|
+
一行に一単語、それを words[i] に格納する「つもり」が、実際はどうなのか。
|
50
|
+
エラーなくコンパイルできる次のコードが
|
51
|
+
|
52
|
+
```C
|
53
|
+
i = 0;
|
54
|
+
while (fscanf(fp, "%s", &words[i]) != EOF) {
|
55
|
+
printf("%s\n", words[i]); // 読み込んだ単語を表示する
|
56
|
+
i++;
|
57
|
+
}
|
58
|
+
printf(" => %s\n", words); // words[] 配列の結果を表示する
|
59
|
+
```
|
60
|
+
"This" "is" "a" "pen" という4単語(4行)を char words[10000]; 配列に読み込む様子です。
|
61
|
+
結果、words[] には "Tiapen" という文字列が残ります。こうしたいわけじゃないでしょ。
|
62
|
+
![words[]を図示](https://ddjkaamml8q8x.cloudfront.net/questions/2022-03-31/140eb728-d11f-4a5c-b9c6-472726a2b89c.jpeg)
|
63
|
+
|
64
|
+
|
65
|
+
|
2
もうひとつ強調個所を修正
test
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
は「 char * 型(charへのポインタ型)を渡すべきなのに、 int 型の値を渡しているよ」ということらしい。第2引数が "%s" なので char へのポインタでなければならない、ということではないかと。
|
10
10
|
|
11
11
|
`` fscanf(siny, "%s", words[i]); `` の第三引数が `` words[i] `` では型が合わないのです。
|
12
|
-
`` words[i] `` だと words というの配列の、**
|
12
|
+
`` words[i] `` だと words というの配列の、**i 番目の値**です。文字配列の中の、ある一要素の値です。その値はポインタではありませんから。
|
13
13
|
|
14
14
|
`` char words[10000] ; `` と変数定義されているので、その一要素の型は char です。その char 型の値は、自動的に int 型に拡張されて、関数(この場合は fscanf())に渡ります。なのでエラーメッセージに 'int' という型名が現れたのです。
|
15
15
|
|
1
最後の行の強調を修正した
test
CHANGED
@@ -38,4 +38,4 @@
|
|
38
38
|
i++;
|
39
39
|
```
|
40
40
|
とすることを考えましたが、これでもまともに動くとは思えません。一見動いたように見えても、質問者が期待したようには動いていないでしょう。
|
41
|
-
siny[], words[] 等の **
|
41
|
+
siny[], words[] 等の **データ構造を見直し、その使い方も見直す必要がある**と思います。目的に合ったデータ構造を用意しないとまともな結果を出せません。
|