scanf说明符是什么;";计数

scanf说明符是什么;";计数,c,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...

作为程序的一部分,我将命令作为一系列令牌进行处理。到目前为止,我得到了:

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”很难看,尤其是在有很多参数的情况下

查看有一个可能的说明符“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...
  }
}

ISO 9899在
7.19.6.2p12
中规定:

n
~~未使用任何输入。相应的参数应为指向的指针 要将读取的字符数写入的有符号整数 到目前为止,调用fscanf函数的输入流。执行 %n指令不增加在 完成fscanf功能的执行。不转换任何参数, 但有一个被消耗掉了。如果转换规范包括转让- 抑制字符或字段宽度时,行为未定义


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

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);
上面的
10 17 27
,允许您在扫描的每个点获得缓冲区内的位置


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

@Andreas不太可能,他们忘了说
n
不计入参数列表中的填充项。在某种程度上,这是一种元信息,因为它描述的是输入,而不是直接来自输入。alinsoar的回答很清楚(“n”不增加赋值计数)。删除了原始注释。您需要检查
sscanf
中的返回值,以便知道
n
值是否有效。它不算作转换,因此请确保在
%n
之前有一个赋值转换规范(或一个后面只有空格),这样就不会出现无法检测到的匹配失败。@JonathanLeffler是的,您是对的。为了使示例简单,我特意省略了错误处理。