Считайте ввод построчно с помощью fgets
и сохраните режим: TEXT
для текста, NUMBER
для чисел и ERROR
для состояния ошибки. (Состояние ошибки не описано. Это может произойти, если вы встретите нечисловые данные, например, в режиме NUMBER
.)
Начните с TEXT
. Перед обработкой строки в текстовом режиме проверьте, может ли это быть цифра простым sscanf
в строке. Если вы можете прочитать число, переключитесь в режим нумерации, где вы сканируете все числа из строки.
char line[80];
enum {TEXT, NUMBER, ERROR = -1} mode = TEXT;
while (mode != ERROR && fgets(line, sizeof(line), stdin)) {
if (mode == TEXT) {
int n;
if (sscanf(line, "%d", &n) > 0) mode = NUMBER;
}
if (mode == TEXT) {
line[strcspn(line, "\n")] = '\0';
process_string(line);
} else if (mode == NUMBER) {
char *p = line;
char *end;
int n = strtol(p, &end, 0);
if (end == p) mode = ERROR;
while (end > p) {
process_number(n);
p = end;
n = strtol(p, &end, 0);
}
}
}
(Но этот подход не удастся, если все числа в одном очень длинны. fgets
усекаетввод, так что указанный размер не будет превышен.)