【问题标题】:sscanf starts to read from beginingsscanf 从头开始​​读取
【发布时间】:2012-11-18 22:34:13
【问题描述】:
int main(){
    int i,j;
    char *data = "1\n2\n";
    sscanf(data, "%d", &i);
    sscanf(data, "%d", &j);
    printf("i=%d, j=%d\n", i, j);
    return 0;
}

如果你run the code 你会看到这个

i=1, j=1

为什么j=1 在这里?不应该是2吗?我错过了一些非常基本的东西吗?

如果我使用sscanf(data, "%d\n%d", &i, &j);,它会显示正确的输出。但是现在下一个 sscanf 调用会重新从头开始读取吗? 这是为什么呢?如何正确阅读?

【问题讨论】:

  • 您指定data 作为起点,不是吗?你还期待什么?
  • 是的,你错过了一些非常基本的东西,你从同一个地址开始,读取一个整数两次,然后两次得到相同的值。没有惊喜。

标签: c string scanf


【解决方案1】:

你的两个sscanf 行可以重写为:

sscanf("1\n2\n", "%d", &i);
sscanf("1\n2\n", "%d", &j);

现在应该很明显为什么ij 都具有1 的值。 sscanf 无法修改data 指向的位置。

使用单个 sscanf 调用来提取两个令牌:

sscanf(data, "%d\n%d", &i, &j);

【讨论】:

  • 在主代码中,我还有很多其他要阅读的标记。甚至它们的长度也是动态的。请参阅this(第 76 行)
  • @shiplu.mokadd.im:您可以通过一个 sscanf 调用提取所有这些令牌。如果您想降低效率,可以使用 strchr 手动更新指向下一个分隔符的指针。
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 2011-02-26
  • 2018-07-12
相关资源
最近更新 更多