C - SCANF 说明符"n"算什么?

  • 本文关键字:SCANF 说明符 c scanf
  • 更新时间 :
  • 英文 :


作为程序的一部分,我将命令处理为一系列标记。到目前为止,我已经得到了:

void exec_this(char* cmd) {
  char token[100] = {0};
  sscanf(cmd, "%s", token)
  if(0 == strcmp(token, "add")) {
    char arg1[100] = {0};
    sscanf(cmd, "%*s%s", arg1);    
    // continue parsing more args...
  }
}

"%*s"很丑陋,尤其是当有很多参数时。

查看 http://www.cplusplus.com/reference/cstdio/scanf/有一个可能的说明符"n"用于检索"到目前为止读取的字符"。不确定在这种情况下"read"是什么意思,因为字符串中有空格和不属于检索到的字符串的内容;"添加 foo 42"。这就是我希望它工作的方式,但不确定它是否正确:

void exec_this(char* cmd) {
  char token[100] = {0};
  int n;
  sscanf(cmd, "%s%n", token, &n);
  if(0 == strcmp(token, "add")) {
    char arg1[100] = {0};
    sscanf(&cmd[n], "%s%n", arg1, &n);
    // continue parsing more args...
  }
}

到目前为止读取的字符数包括所有空格:

int a, b, c;
sscanf("     quick  brown       fox jumps", "%*s%n%*s%n%*s%n", &a, &b, &c);
printf("%d %d %dn", a, b, c);

以上打印10 17 27,可让您在扫描的每个点获得缓冲区内的位置。

这非常适合您的用例,因为您可以在进入第二个sscanf时跳过第一个sscanf中处理的字符数。您可以使用&cmd[n]或等效cmd+n跳过初始n字符。

ISO 9899 在 7.19.6.2p12 上说:

n~~不消耗任何输入。相应的参数应是指向的指针 要写入的有符号整数,从中读取的字符数 到目前为止,通过对 FSNF 函数的调用输入流。 执行 %n 指令不会递增在 完成 FSANF 函数的执行。 不转换任何参数, 但一个被消耗掉了。如果转换规范包含分配- 禁止显示字符或字段宽度时,行为未定义。

最新更新