scanf 说明符“n”算什么?

And*_*eas 5 c scanf

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

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

“%*s”很难看,尤其是当有很多参数时。

\n\n

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

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

das*_*ght 3

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

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);
Run Code Online (Sandbox Code Playgroud)

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

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