【问题标题】:Why does the sscanf %n format specifier have no effect on the return value?为什么 sscanf %n 格式说明符对返回值没有影响?
【发布时间】:2019-11-26 22:19:08
【问题描述】:

下面的 sscanf 函数的返回值为 1,无论 %n 说明符是否存在。然而变量 n 中的值发生了变化(在这种情况下从 0 变为 5),那么为什么函数不返回 2?

#include <stdio.h>

int main() {
    int d = 0, n = 0;
    char *p = "10   foo bar";
    printf("%d\n", sscanf(p, " %d %n", &d, &n ) );
    printf("%d %d\n", d, n);
    return 0;
}

在我看来,这是设计使然,而不是此处的代码存在问题。这是因为 %n 不能失败,因为它只是计算读取的字符,因此以这种方式检查它是多余的吗?谢谢,我很想进一步了解这里发生了什么。

【问题讨论】:

  • 因为没有从输入流中扫描该值。该函数返回成功扫描的输入数。
  • C18 说:“%n 指令的执行不会增加 fscanf 函数执行完成时返回的赋值计数。” 这是一个设计决策。

标签: c scanf


【解决方案1】:
sscanf(p, " %d %n", &d, &n )

%n (next) 是到目前为止从输入缓冲区读取的字节数。它是一个输出参数,指示在 sscanf 函数返回之前输入缓冲区已读取多远。 sscanf返回值不同,表示“输入项匹配成功的个数”。

您可以将%n(以及int n 下一个参数)视为辅助输出(或返回)值。

https://linux.die.net/man/3/sscanf

到目前为止从输入中消耗的字符数通过下一个指针存储。


一些例子供你看%n(下一个指针)的效果:

int d = 0, n = 0;
// char *p = "100   foo bar";  // 100, 6    // read upto 6 chars, parse 100
// char *p = "100foo bar";     // 100, 3    // read upto 3 chars, parse 100
// char *p = "foo100 bar";     // 0, 0      // read 0 chars, fails to parse any int
char *p = "10   foo bar";      // 10, 5     // read 5 chars, parse 10

printf("%d\n", sscanf(p, " %d %n", &d, &n ) );

printf("%s\n", (p + n));       // "foo bar"

【讨论】:

    【解决方案2】:

    来自 C99(第 7.19.6.2 节):

    %n 指令的执行不会增加在 fscanf 函数的执行完成。

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多