В этом коде getchar
вызывается для его побочных эффектов: он читает символ из стандартного ввода и выбрасывает его.
Возможно, это считывает ввод от пользователя. scanf
будет потреблять число, но оставить символ новой строки после номера нетронутым. getchar
потребляет новую строку и отбрасывает ее. Это не является строго необходимым в этом цикле, потому что следующийscanf
пропустит пробел, чтобы найти следующий номер, но может быть полезно, если код после цикл не ожидает, что новая строка станет первой вещь на stdin.
Этот код глючит, потому что он не проверяет EOF, потому что он ничего толкового не делать, когда вход не число или когда есть больше текста на линии после номера, и из-за него использует scanf
, который разбит как указано (например, разрешено сбой программы, если вход переполняет диапазон int
). Лучше код будет что-то вроде
char *linep = 0;
size_t asize = 0;
char *endp;
long c;
while (getline(&linep, &asize, stdin) > 0) {
errno = 0;
c = strtol(linep, &endp, 10);
if (linep == endp || *endp != '\0' || errno) {
puts("?Redo from start");
continue;
}
if (c == 0) break;
do_something_with(c);
}
free(linep);
Подсказка: попробуйте с типом 'char'. Здесь это избыточно. –
отлично спасибо – james