W C11 gets
została zastąpiona przez gets_s
który ma następującą deklarację:
char *gets_s(char *str, rsize_t n);
Funkcja ta przeczytać co najwyżej n-1
znaki z stdin
w *str
. Ma to na celu uniknięcie luki w zabezpieczeniach polegającej na przepełnieniu bufora, która jest nieodłączna od gets
. Funkcja fgets
jest również opcją. Od http://en.cppreference.com/w/c/io/gets:
gets() funkcja nie wykonuje sprawdzanie granic, dlatego ta funkcja jest niezwykle podatny na przepełnienie bufora ataków. Nie można go bezpiecznie używać (chyba że program działa w środowisku, które ogranicza to, co może pojawić się na stdin). Z tego powodu funkcja została wycofana w trzecim sprostowaniu do standardu C99 i usunięta całkowicie w standardzie C11. fgets() i gets_s() są zalecanymi zamiennikami.
Nigdy nie używaj pobiera().
Zważywszy, że gets_s
jest zdefiniowane w rozszerzenie standardu, tylko ewentualnie wdrożony, należy prawdopodobnie pisać swoje programy za pomocą fgets
zamiast. Jeśli użyjesz fgets
na stdin
Twój program będzie również kompilował we wcześniejszych wersjach C. Pamiętaj jednak o różnicy w zachowaniu: gdy gets_s
odczytał n-1
znaków , kontynuuje czytanie aż do momentu, gdy nowa linia lub koniec pliku zostanie osiągnięty , odrzucając dane wejściowe. Tak więc z gets_s
zawsze czytasz całą linię, nawet jeśli tylko jej część może zostać zwrócona w buforze wejściowym.
fgets (..., ..., stdin) –