Как использовать sscanf в циклах? - PullRequest
23 голосов
/ 20 октября 2010

Есть ли хороший способ перебрать строку с 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 Ответ

45 голосов
/ 20 октября 2010

Найдите спецификатор преобразования %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;
}

Изменил 'line' на 'data', потому что вы не можете увеличить имя массива.

...