質問: ### 前提・実現したいこと C++で簡単なタイピングゲームを作っています。 ファイルからランダムな行を読み込んで、","で分割して分割した2番目の単語を入力させるものです。 ### 発生している問題・エラーメッセージ ループ中、時々p_word_afterの指す値がNULLになります。この時、p_word_beforeの指す文字列は一つ前のループのときと同じになっています。 ちなみに、rand()%55の値が同じである場合はp_word_afterに値が入っているので、これは原因ではないと思います。これはどういった現象なんでしょうか。 ### 該当のソースコード ``` int key=0,count,score=0,mistake=0,ran=0,line,add,word_num; int level=0; char *advise; unsigned i; char line_text[256]; char word_before[50][128]; char word_after[50][128]; char *p_word_before; char *p_word_after; FILE *fp; fp=fopen(<>,"r"); for(count=50;count>0;count--){ rewind(fp); p_word_before=word_before[count]; p_word_after=word_after[count]; int len; srand((unsigned)time(NULL)); line=0; for(line=rand()%55;line>0;line--){ fgets(line_text,256,fp); } p_word_before=strtok(line_text,","); p_word_after=strtok(NULL,","); system("cls"); add=0; while(*(p_word_after+add)!='\n'){ add++; } *(p_word_after+add)='\0'; printf("%s (%s) 残り%d単語\n",p_word_before,p_word_after,count); i=0; len=strlen(p_word_after); while(i
回答: こんにちは。 ざっと見る限り、yasunori_bamさんが記載されている現象が起こるソースのようには見えません。 `rand()%55`が0の時は`fgets(line_text,256,fp);`が実行されませんので、p_word_beforeに「前回」のfor(count)ループ時の値が入ることはありえますが、その時、p_word_afterにも前回と同じ値が入る筈なのでNULLにはならない筈です。 また、`rand()%55`が例えば5の時、p_word_afterに値が入ったり、NULLが入ったりするのですね? それもちょっと考えにくいです。・・・1 ただ、もし、サブ・スレッドを使っていてサブ・スレッドでもstrtok()を使っていたら、何が起こるか分かりませんので、ご説明されたような事象が起きる可能性はあります。strtok()はスレッド安全ではありませんので。 しかし、ご提示された内容からサブ・スレッドを使っているとは思えません。 試しに、下記の直後で、line_text、p_word_before、p_word_afterを表示してみては如何でしょうか? 何か掴めそうな気がします。 > > p_word_before=strtok(line_text,","); > > p_word_after=strtok(NULL,","); > > > ところで、1の現象はどのようにして確認されましたか? どうもその確認にミスがありそうな予感がします。 また、ファイルは55行以上存在し、その全ての行にはp_word_afterがNULLになることはない文字列が入っていることは確認できていますか? 例えば、p_word_afterがNULLにならない行を55行コピペしておけば簡単に条件を作れると思います。 因みに下記はミスですね?(特に影響はないと思いますが。) > > p_word_before=word_before[count]; > > p_word_after=word_after[count]; > > > countは50から始まりますが、 word_before[50][128], word_after[50][128]ですので、word_before[49][], word_after[49][]までしかありません。