【问题标题】:sscanf: Get a pointer to end positionsscanf:获取指向结束位置的指针
【发布时间】: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 是的,我想这正是我要找的答案!
  • 很高兴我能帮上忙。玩得开心:)

标签: c pointers scanf


【解决方案1】:

在格式字符串...和对应的变量中使用"%n"转换说明符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多