Как правило, fgets()
считается хорошим вариантом.Он читает целые строки в буфер, и оттуда вы можете делать то, что вам нужно.Если вам нужно поведение, подобное scanf()
, вы можете передать прочитанные строки в sscanf()
.
Основное преимущество этого заключается в том, что если строка не преобразуется, ее легко восстановить, тогда как с помощьюscanf()
у вас остался ввод на stdin
, который вам нужно слить.Кроме того, вы не попадете в ловушку смешивания линейно-ориентированного ввода с scanf()
, что вызывает головную боль, когда такие вещи, как \n
остаются на stdin
, что обычно приводит к тому, что новые кодеры полагают, что входные вызовы были полностью проигнорированы.
Что-то вроде этого может быть вам по вкусу:
char line[256];
int i;
if (fgets(line, sizeof(line), stdin)) {
if (1 == sscanf(line, "%d", &i)) {
/* i can be safely used */
}
}
Над вами следует отметить, что fgets()
возвращает NULL
в EOF или в ошибке, поэтому я завернул ее вif
.Вызов sscanf()
возвращает количество полей, которые были успешно преобразованы.
Имейте в виду, что fgets()
может не прочитать всю строку, если строка больше вашего буфера, что в «серьезной» программеэто то, что вы должны учитывать.