回答編集履歴

4

コードミスを修正

2022/03/31 00:33

投稿

rubato6809
rubato6809

スコア1380

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

図を追加

2022/03/31 00:31

投稿

rubato6809
rubato6809

スコア1380

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

もうひとつ強調個所を修正

2022/03/29 06:56

投稿

rubato6809
rubato6809

スコア1380

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 というの配列の、** i 番目の値 **です。配列の中の、ある一要素の値です。その値はポインタではありませんから。
12
+ `` words[i] `` だと words というの配列の、**i 番目の値**です。文字配列の中の、ある一要素の値です。その値はポインタではありませんから。
13
13
 
14
14
  `` char words[10000] ; `` と変数定義されているので、その一要素の型は char です。その char 型の値は、自動的に int 型に拡張されて、関数(この場合は fscanf())に渡ります。なのでエラーメッセージに 'int' という型名が現れたのです。
15
15
 

1

最後の行の強調を修正した

2022/03/29 06:52

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -38,4 +38,4 @@
38
38
  i++;
39
39
  ```
40
40
  とすることを考えましたが、これでもまともに動くとは思えません。一見動いたように見えても、質問者が期待したようには動いていないでしょう。
41
- siny[], words[] 等の ** データ構造を見直し、その使い方も見直す必要がある ** と思います。目的に合ったデータ構造を用意しないとまともな結果を出せません。
41
+ siny[], words[] 等の **データ構造を見直し、その使い方も見直す必要がある**と思います。目的に合ったデータ構造を用意しないとまともな結果を出せません。