Подтвердить что ты не робот

Как использовать sscanf в циклах?

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

Есть ли простое решение, о котором я забываю?

4b9b3361

Ответ 1

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

Изменена "строка" на "данные", потому что вы не можете увеличивать имя массива.