入力テキストファイルの内容を読み込んで欲しい部分だけを抽出するプログラムを作っています。
テキストの内容を1行ずつ読み込み、コード内のwhile内でbase、posの内容を出力します。
しかし、
出力結果//////////
原型はaです、品詞はDTだ
原型はbrokenです、品詞はJJだ
原型はbikeです、品詞はNNだ
原型はbeです、品詞はVBZだ
原型はrepaiedです、品詞はVBNだ
////////
の後に実行ファイルが動作を停止してしまいます。
一行ずつステップインしてどこが悪いか見ていったところ
5回目のループが終わり、6回目のループ(dataにはNULLが入っているとき)に39行目のstrtok_sの内容がおかしいらしく、止まってしまうようでした。strtok_s自体は私がつくったわけではないですし、かつ動作が停止するまではちゃんと動いていたのでどこが悪くて
動作停止するかわかりません。
現段階で出力したい部分は出ているのであとはただプログラムが正常終了すればいいのですが、どうすれば正常終了するようになるでしょうか。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAXLEN 3000 //文字列の長さ
int main (int argc, char **argv)
{
typedef struct{
char* base;
int id;
char *pos;
char arg;
}_token;
_token p;
FILE *fp;
char data[256]; //単語のデータを格納
FILE *fp2; //fp2は入力ファイル
errno_t error;
char* ctx;
if ((error = fopen_s(&fp2, "RESULT4.txt", "r")) !=0) {
printf("file open error!!\n");
exit(EXIT_FAILURE); /* エラーの場合は通常、異常終了する */
}
while(fgets(data, sizeof(data), fp2) != NULL){
p.base = strstr(data, "base");
p.base = strtok_s((p.base)+6, "\"", &ctx);
printf("原型は%sです、", p.base);
p.pos = strstr(data, "pos");
p.pos = strtok_s((p.pos)+5, "\"", &ctx);
printf("品詞は%sだ\n", p.pos);
}
fclose(fp2);
return 0;
}0 1 tok id="t0" cat="D" pos="DT" base="a" lexentry="[<D>]N" pred="det_arg1" type="noun_mod" arg1="c3"
2 8 tok id="t1" cat="ADJ" pos="JJ" base="broken" lexentry="[<ADJP>]N" pred="adj_arg1" type="noun_mod" arg1="c5"
9 13 tok id="t2" cat="N" pos="NN" base="bike" lexentry="[D<N.3sg>]" pred="noun_arg0"
14 16 tok id="t3" cat="V" pos="VBZ" base="be" lexentry="[NP<V.be.bse>VP.pas]_sctl-singular3rd_verb_rule" pred="aux_arg12" aux="be" arg1="c1" arg2="c8"
17 25 tok id="t4" cat="V" pos="VBN" base="repair" lexentry="[NP.nom<V.bse>NP.acc]-passive_verb_rule-drop_by_rule" pred="verb_arg12" tense="present" aspect="none" type="none" voice="passive" aux="minus" arg1="unk" arg2="c1"