我的问题是使用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}}中删除最后一个字符,但在第二行分号后不会删除注释。无论我正在解析的文本文件的内容如何,这都是非常标准的行为。我在这里错过了什么?谢谢。
答案 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);