scanf说明符“n”的计数是什么?

时间:2017-10-28 11:13:26

标签: 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”用于检索“到目前为止读取的字符”。在这种情况下,不确定“读”是什么意思,因为字符串中的空格和内容不是检索到的字符串的一部分; “添加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...
  }
}

2 个答案:

答案 0 :(得分:2)

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

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

以上prints 10 17 27,让您在扫描的每个点获取缓冲区内的位置。

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

答案 1 :(得分:1)

ISO 9899在7.19.6.2p12说:

  
    

n ~~没有输入消耗。相应的参数应该是指向     有符号整数,其中写入从中读取的字符数     到目前为止,通过调用fscanf函数的输入流。执行一个     %n指令不会增加返回的赋值计数     完成fscanf函数的执行。没有参数被转换,     但是有一个被消耗了。如果转换规范包括转让 -     抑制字符或字段宽度,行为是未定义的。