phrases[i].English = malloc(sizeof(char));
问题在于,您分配一个字节,然后尝试将一个字符串塞入其中,这会导致此处出现未定义的行为:
fscanf(infile,"%s", phrases[i].English);
一般来说,您应该假设一个合理的缓冲区长度并读取它,并检查是否包含新行。如果情况并非如此,请再次读入另一个缓冲区或放大旧缓冲区(使用realloc http://en.cppreference.com/w/c/memory/realloc)。
要么使用非标准函数,例如getline http://linux.die.net/man/3/getline这已经在幕后为你做了这件事。
鉴于您的行是非常短的句子,恒定的缓冲区大小就足够了(我们称之为MAX_LINE
),这为我们提供了一种更简单的方法来实现相同的目标:
fscanf(infile, "%*[^\n]s", MAX_LINE, buf);
这会读取一个长度的字符串MAX_LINE
进入缓冲区buf
并在之前终止'\n'
遇到。
读取字符串时,应避免使用fscanf("%s", buf)
并使用fgets() http://en.cppreference.com/w/c/io/fgets or scanf("%*s", MAX_LINE, ...)
反而。这可确保不会尝试写入比您指定的数据更多的数据,从而避免缓冲区溢出。
编辑:嵌套循环不应该在那里。你基本上是在覆盖phrases[i].TextSpeak
总共phraseCounter
次没有任何好处。在此过程中,您会泄漏大量内存。