Как использовать 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
}
Есть ли простое решение, о котором я забываю?
Ответы
Ответ 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;
}
Изменена "строка" на "данные", потому что вы не можете увеличивать имя массива.