如何在循环中使用sscanf?

时间:2010-10-20 06:24:37

标签: c string scanf

是否有一种使用sscanf循环字符串的好方法?

假设我有一个看起来像这样的字符串:

char line[] = "100 185 400 11 1000";

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

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

但是没有干净的方法可以从sscanf中获取这些信息。如果它返回消耗的字节数,那将是有用的。在这种情况下,人们可以使用strtok,但能够写出类似于stdin所能做的事情会很高兴:

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

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

1 个答案:

答案 0 :(得分:45)

查找sscanf()和家人的%n转换说明符。它为您提供所需的信息。

#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;
}

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