teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

補足説明追加

2016/05/08 14:43

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -20,3 +20,7 @@
20
20
  そうなると、`line_text`に正しい文字列が入らず、`strtok`関数が正しい結果を返さないのだと思います。
21
21
 
22
22
  `line=rand()%55 + 1`とすれば良いと思います。
23
+
24
+ ---
25
+ 補足
26
+ `strtok`関数は、返すべき文字列がないとNULLを返します。前述のループでfgetsを実行しないまま抜けると、前回のバッファの内容が残っているわけですが、区切り文字が消されてしまっているので最初のstrtokで文字列全体を返してしまい、次のstrtokでは返すべき文字列がないという状況になったのだと思われます。

1

追記

2016/05/08 14:43

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -7,4 +7,16 @@
7
7
  > p_word_before=word_before[count];
8
8
  > p_word_after=word_after[count];
9
9
 
10
- それぞれの配列は`[50]`で確保されているため、添え字に指定可能な範囲は`0~49`です。ループ初回でcountに50が入っているので、配列の範囲を超えています。
10
+ それぞれの配列は`[50]`で確保されているため、添え字に指定可能な範囲は`0~49`です。ループ初回でcountに50が入っているので、配列の範囲を超えています。
11
+
12
+ ---
13
+ しっかり見て気になった点を。
14
+
15
+ > for(line=rand()%55;line>0;line--){
16
+ > fgets(line_text,256,fp);
17
+ > }
18
+
19
+ `rand()%55`は0になる可能性があります。その場合、条件判定でいきなりループ終了になるため、ループ内のfgetsが実行されません。
20
+ そうなると、`line_text`に正しい文字列が入らず、`strtok`関数が正しい結果を返さないのだと思います。
21
+
22
+ `line=rand()%55 + 1`とすれば良いと思います。