Если вы должны использовать scanf
, чтобы принять ввод, я думаю, вы начнете с чего-то вроде следующего.
int array[MAX];
int i, n;
scanf("%d", &n);
for (i = 0; i < n && !feof(stdin); i++) {
scanf("%d", &array[i]);
}
Это решит (более или менее) проблему ввода в произвольном формате, поскольку scanf
автоматически пропустит начальный пробел при сопоставлении с форматом %d
.
Ключевым наблюдением для многих других ваших проблем является то, что scanf
сообщает вам, сколько кодов формата он успешно проанализировал. Таким образом,
int matches = scanf("%d", &array[i]);
if (matches == 0) {
/* no integer in the input stream */
}
Я думаю, что это касается непосредственно (3) и (4)
Само по себе это не совсем обрабатывает регистр ввода 12a3
. В первый раз в цикле scanf
будет анализировать '12 as an integer 12, leaving the remaining
a3` для следующего цикла. Вы получите сообщение об ошибке в следующий раз. Это достаточно хорошо для целей вашего профессора?
Для целых чисел, превышающих maxint , например, "999999 ....... 999", я не уверен, что вы можете сделать с прямыми scanf
.
Для входов больше, чем входной массив , это не проблема scanf
как таковая . Вам просто нужно посчитать, сколько целых чисел вы уже проанализировали.
Если вам разрешено использовать sscanf
для декодирования строк после того, как они были извлечены из входного потока чем-то вроде scanf("%s")
, вы также можете сделать что-то вроде этого:
while (...) {
scanf("%s", buf);
/* use strtol or sscanf if you really have to */
}
Это работает для любой последовательности слов, разделенных пробелами, и позволяет вам отдельно сканировать ввод слов и затем проверять, выглядят ли эти слова как числа или нет. И, если нужно, вы можете использовать scanf
вариантов для каждой детали.