Есть (как минимум) два основных решения. Один из них заключается в том, чтобы продолжать читать числа в одиночку, поэтому вас действительно не слишком беспокоит наличие запятых или нет; другой - читать числа в парах.
Опция A включает в себя небольшую настройку строки формата от "%d,%n"
до "%d %n"
, чтобы вы узнали, где заканчивается число (точнее, где первый символ это не пробел появляется после числа), и пропустите запятую отдельно в al oop:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char data[500];
char *src = data;
fgets(src, 500, stdin);
int arr[500];
int index = 0;
int n;
while (sscanf(src, "%d %n", &arr[index], &n) == 1)
{
printf("%d\n", arr[index++]);
src += n;
if (*src == ',')
{
putchar('=');
src++;
}
}
return 0;
}
putchar('=')
позволяет мне видеть, когда запятая пропущена; он не будет присутствовать в «производственном» коде.
Пример вывода (Bash Здесь String запись):
$ read41 <<< '1,2 3,4 5,6 7, 8 9,10, 11 , 12xyz'
1
=2
3
=4
5
=6
7
=8
9
=10
=11
=12
$
Будьте осторожны - завершающий пробел в формате scanf()
разрушительно для интерактивного ввода, но безвредно для sscanf()
. Обратите внимание, что в данных есть случайная запятая после 10
, но эта версия кода не заботится об этом. Ему также не важно, где символы новой строки появляются парами (или не будет, если он повторяется на while (fgets(data, sizeof(data), stdin) != 0) { char *src = data; … }
).
Опция B предполагает чтение чисел в парах. Поскольку вы используете sscanf()
в al oop, вам все еще нужна спецификация преобразования %n
. Второй пробел в строке формата (после запятой) не является строго обязательным (%d
пропустит также пробел), но он безвреден и симметричен c. Это требует наличия одной запятой между парами чисел, которые должны находиться на одной строке (но допускается использование пробелов или без пробелов вокруг запятой), и пары должны появляться на одной строке.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char data[500];
int arr[500];
int index = 0;
while (fgets(data, sizeof(data), stdin) != 0)
{
int n;
char *src = data;
while (sscanf(src, "%d , %d %n", &arr[index + 0], &arr[index + 1], &n) == 2)
{
printf("(%d,%d)\n", arr[index + 0], arr[index + 1]);
src += n;
index += 2;
}
}
return 0;
}
Пример вывода (используя Bash ANSI- C Цитируя тоже):
$ read43 <<< $'1,2 3,4 5,6 7,8\n9,10 11 , 12xyz'
(1,2)
(3,4)
(5,6)
(7,8)
(9,10)
(11,12)
$