如何在循环中使用sscanf?

And*_*ter 23 c string scanf

有一个很好的方法循环一个字符串sscanf吗?

假设我有一个如下所示的字符串:

char line[] = "100 185 400 11 1000";
Run Code Online (Sandbox Code Playgroud)

我想打印这笔款项.我真正想写的是:

int n, sum = 0;
while (1 == sscanf(line, " %d", &n)) {
  sum += n;
  line += <number of bytes consumed by sscanf>
}
Run Code Online (Sandbox Code Playgroud)

但是没有干净的方法来获取这些信息sscanf.如果它返回消耗的字节数,那将是有用的.在这样的情况下,人们可以使用strtok,但能够写出类似于你可以做的事情的东西是很好的stdin:

int n, sum = 0;
while (1 == scanf(" %d", &n)) {
  sum += n;
  // stdin is transparently advanced by scanf call
}
Run Code Online (Sandbox Code Playgroud)

有一个我忘记的简单解决方案吗?

Jon*_*ler 46

查找%n转换说明符sscanf()和系列.它为您提供所需的信息.

#include <stdio.h>

int main(void)
{
    char line[] = "100 185 400 11 1000";
    char *data = line;
    int offset;
    int n;
    int sum = 0;

    while (sscanf(data, " %d%n", &n, &offset) == 1)
    {
        sum += n;
        data += offset;
        printf("read: %5d; sum = %5d; offset = %5d\n", n, sum, offset);
    }

    printf("sum = %d\n", sum);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

将"line"更改为"data",因为您无法增加数组的名称.

  • @Green Code:多年来,我在许多机器上阅读、重读、重读该函数的手册页,并使用我的 C 标准副本等。我认为这实际上是第一次我使用了 `%n` 表示法,但它工作正常。**注意**:`%n` 也存在于 `printf()` 中,并具有类似的含义。它成为一个风险因素,因为它是主要读取值的函数中的*输出*值。它也被 TR24731 的“printf()”的安全版本禁止。管理格式字符串攻击程序的人可以使用 `%n` 产生破坏性影响。 (2认同)