让fgets跳过特殊字符

时间:2018-06-18 14:11:16

标签: c parsing fgets strtok

我的问题是使用fgets解析文本文件。基本上我需要解析一些命令。一旦我点击";",之后的任何内容都是评论,可以跳过:

defun main
5 3 2 * + printnum endl     
3 4 5 rot * + printnum endl 
return

处理完毕后:

while (fgets(str, 1000, IN)!= NULL)
        {
            len = strlen(str);
            str[len-1] = '\0'; //removes newline character
            printf("%s\n", str);
            hello = strtok(str,";");
            printf("%s\n", hello);

        }

在我的代码中,我有一个while循环来从文本文件中获取每一行:

strtok

我不确定如何将其设置在哪里,当 Very basic test - no ifs or comparisons defun main 5 3 2 * + printnum endl 3 4 5 rot * + printnum endl retur 看到分号时,它会自动删除之后的任何内容,直到该行结束。我的尝试返回以下输出:

return

它会从{{1}}中删除最后一个字符,但在第二行分号后不会删除注释。无论我正在解析的文本文件的内容如何,​​这都是非常标准的行为。我在这里错过了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

问题来自strtok。正如man strtok所说:

  

strtok()函数将字符串分解为零或更多的序列          非空标记

[...]

  

根据以上描述,遵循两个或更多个的序列          解析后的字符串中的连续分隔符字节被认为是a          单个分隔符,以及在开头或结尾的分隔符字节          字符串被忽略

(强调我的。)

每当您的行以一个或多个;字符开头时,strtok将忽略它们。

要解决此问题,您应该在字符串中搜索;的第一个匹配项,如果找到,则将其替换为'\0'(NUL终结符)。

变式1(使用strchr / if):

char *p = strchr(str, ';');
if (p) {
    *p = '\0';
}
printf("%s\n", str);

变体2(strcspn,厚颜无耻):

str[strcspn(str, ";")] = '\0';
printf("%s\n", str);