C - 使用 strtok 的嵌套循环

C - Nested loop using strtok

我正在尝试使用 strtok 将文本文件拆分为可以传递给拼写检查功能的字符串,该文本文件包含“\n”、“?!,.”等字符ETC... 我需要打印任何未通过拼写检查的单词以及它们所在的行号。跟踪路线是我正在努力的事情。 到目前为止,我已经尝试过了,但文本文件的第一行只有 returns 结果:

char str[409377];
fread(str, noOfChars, 1, file);
fclose(file);

int lines=1;
char *token;
char *line;
char splitLine[] = "\n";
char delimiters[] = " ,.?!(){}*&^%$£_-+=";
line = strtok(str, splitLine);
while(line!=NULL){
    token = strtok(line, delimiters);
    while(token != NULL){
        //print is just to test if I can loop through all the words
        printf("%s", token);
        //spellCheck function & logic here
        token = strtok(NULL, delimiters);
    }
    line = strtok(NULL, splitLine);
    lines++
}

可以使用嵌套的while循环和strtok吗?有没有更好的方法来跟踪行号?

strtok函数不是可重入的!它不能用于同时标记多个字符串。这是因为它保留有关当前被标记化的字符串的内部状态。

如果您有现代编译器和标准库,则可以改用 strtok_s。否则你必须想出另一个解决方案。

可以使用strtok,但是不太好用。这是一个愚蠢的函数,它真正做的就是用 nuls 和 return 替换分隔符,指向它分隔的序列的开头。所以它是破坏性的。它无法处理特殊情况,例如允许一个撇号的英语单词(we're 是一个单词,we're'e 不是),您必须确保明确列出所有分隔符。

最好自己编写 mystrok,这样您就可以了解它是如何工作的。然后将其用作您自己的单词提取器的基础。

你的错误的原因是你砍掉了第一行,然后这就是 strok 在后续调用中看到的全部内容。