【发布时间】:2019-01-20 17:57:27
【问题描述】:
我想解析一个const char *str 字符串,我需要分段读取它,并多次调用sscanf()
我有一些例子,如果它是文件的文本,我可以做什么,可以用fscanf() 解析,这会将FILE *fp 指针更新到它停止读取的位置:
fscanf(fp, "name %s ", name);
fscanf(fp, "date %*i ");
fscanf(fp, "{ ");
fscanf(fp, " isdst %*i ");
fscanf(fp, " yday %*i ");
fscanf(fp, " wday %*i ");
fscanf(fp, " year %i ", &year);
fscanf(fp, " mon %i ", &mon);
fscanf(fp, " mday %i ", &day);
但是sscanf() 不会更新指针。有没有办法做到这一点?
编辑:
来自@pmg 评论,我现在有这个代码:
if (sscanf(str, " %lf%n", &a, &pos) != 1)
goto err;
str += pos;
if (sscanf(str, " %i%n", &b, &pos) != 1)
goto err;
str += pos;
应该相当于一行:
if (sscanf(str, " %lf %i", &a, &b) != 2)
goto err;
%n 是这样做的吗?
【问题讨论】:
-
在格式字符串中使用
"%n"转换说明符...和对应的变量 -
我建议你阅读lines,然后使用
sscanf解析你想要解析的行(跳过你不想解析的行)。并始终检查任何类似scanf的函数返回。我的猜测是你所做的解析不起作用,fscanf会在某个时候返回0(甚至EOF?)。 -
@Someprogrammerdude 是的,我应该检查 fscanf,但它正在读取我编写的文件并且知道其中包含所有内容,因此它永远不会失败(尽管无论如何检查可能会更好, 因为有人可能恶意修改它,所以谢谢)
-
@pmg 是的,我想这正是我要找的答案!
-
很高兴我能帮上忙。玩得开心:)