Ogólnie rzecz biorąc, fgets()
jest uważana za dobrą opcję. Czyta całe linie w buforze, a stamtąd możesz zrobić to, czego potrzebujesz. Jeśli chcesz zachowanie takie jak scanf()
, możesz przekazać ciągi, które czytasz, do sscanf()
.
Główną zaletą tego jest to, że jeśli ciąg nie może się przekonwertować, łatwo jest odzyskać, natomiast z scanf()
masz dane wejściowe na stdin
, które musisz odcedzić. Co więcej, nie wpadniesz w pułapkę mieszania wejścia zorientowanego liniowo z scanf()
, co powoduje bóle głowy, gdy na przykład zostaje pozostawione na stdin
, co zwykle prowadzi nowych programistów do przekonania, że połączenia wejściowe zostały całkowicie zignorowane.
Coś takiego może być do swoich potrzeb:
char line[256];
int i;
if (fgets(line, sizeof(line), stdin)) {
if (1 == sscanf(line, "%d", &i)) {
/* i can be safely used */
}
}
Przede należy pamiętać, że fgets()
powraca NULL
na EOF lub błędów, dlatego ja owinął je w if
. Wywołanie sscanf()
zwraca liczbę pól, które zostały pomyślnie przekonwertowane.
Należy pamiętać, że fgets()
może nie odczytać całej linii, jeśli linia jest większa niż bufor, co w "poważnym" programie jest z pewnością czymś, co należy wziąć pod uwagę.
To bardzo zależy od tego, co robi twój program zrobić. Polecam (prawie w każdej sytuacji) użycie 'scanf' i sprawdzenie jego wartości zwracanej. – asaelr
'scanf' jest standardową metodą uzyskiwania sformatowanych danych wejściowych w języku C, a' fgets'/'fgetc' jest zalecaną funkcją standardową służącą do uzyskiwania całych linii lub pojedynczych znaków. Większość innych funkcji jest niestandardowych lub zależnych od platformy. –
Nie ma powodu, aby nie używać 'getline' w poważnym programie. Jeśli twoja platforma go nie ma, możesz ją zaimplementować w terminach 'fgets' i' malloc'. –