首页 文章

C - 使用strtok的嵌套循环

提问于
浏览
0

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

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?有没有更好的方法来跟踪行号?

2 回答

  • 1

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

    如果您有一个现代编译器和标准库,那么您可以使用strtok_s . 否则你必须提出另一种解决方案 .

  • 1

    你可以使用strtok,但它不是很容易使用 . 它是一个愚蠢的函数,所有它真正做的是用nuls替换分隔符并返回指向它所分隔的序列的开始的指针 . 所以它具有破坏性 . 它不能处理特殊情况,例如英语单词被允许一个撇号(我们是一个单词,我们不是),你必须确保你具体列出所有分隔符 .

    最好自己写一个mystrok,这样你才能理解它是如何工作的 . 然后使用它作为您自己的单词提取器的基础 .

    你的错误的原因是你切断了第一行,然后这就是后续调用中看到的所有内容 .

相关问题