Функция gets() считывает символы из stdin и помещает их в массив символов, на который указывает str. Символы считываются до тех, пока не встретится новая строка или EOF. Символ «новая строка» не делается частью строки, а транслируется в нулевой символ, завершающий строку.
В случае успеха gets() возвращает str, в противном случае она возвращает NULL. В случае ошибки по чтению содержимое массива, на который указывает str, не определено.
Поскольку NULL возвращается как в случае ошибки, так и при достижении конца файла, то следует использовать feof() или ferror(), чтобы выяснить, что именно произошло.
Количество символов, считываемых gets(), не ограничивается. Поэтому программист должен сам следить за тем, чтобы не выйти за границы массива, на который указывает str.
В данной программе gets ( ) используется для чтения имени файла :
#include
#include
int main ( void )
{
FILE * fp ;
char fname [ 128 ] ;
printf ( «Enter filename: » ) ;
Vulnerabilities of the gets function in C
gets ( fname ) ;
if ( ( fp = fopen ( fname , «r» ) ) == NULL ) {
printf ( «Cannot open file. n » ) ;
exit ( 1 ) ;
}
.
fclose ( fp ) ;
return 0 ;
}
Источник: www.c-cpp.ru
Функция gets
Получить строку из стандартного потока ввода. Функция gets считывает символы из стандартного потока ввода до символа новой строки n или до тех пор, пока не будет достигнут конец файла EOF , после чего сохраняет считанные символы в строку типа char .
Символ новой строки n не копируется в строку.
Нулевой символ автоматически добавляется после последнего копируемого символа в string , чтобы сигнализировать о конце строки.
Обратите внимание, что функция gets несколько отличается от функции fgets , во-первых возвращает строку из стандартного потока ввода в качестве аргумента, а, во-вторых, конечный символ новой строки не входит в её состав . в отличие от fgets . А ещё, gets не позволяет установить ограничение на количество считываемых символов, поэтому нужно быть осторожными с размером массива, на который указывает параметр str , чтобы избежать переполнения буфера.
Параметры:
- string
Указатель на массив типа char , в котором сохраняется строка.
Возвращаемое значение
В случае успеха, функция возвращает тот же параметр, string . Если происходит ошибка, возвращается нулевой указатель.
Используйте функции ferror или feof для проверки внутренних состояний показателей ошибки или конца файла — EOF .
Пример: исходный код программы
//пример использования функции gets #include #include int main() < char string [256]; std::cout << «Введите свой полный адрес: «; gets(string); // считать строку из стандартного потока ввода std::cout
Источник: cppstudio.com
C Programming Tutorial — 67: The gets() and puts() Functions
gets, gets_s
1) Считывает стандартный stdin в массив символов, на который указывает str , до тех пор, пока не будет найден символ новой строки или не произойдет конец файла. Нулевой символ записывается сразу после последнего символа, считанного в массив. Символ новой строки отбрасывается, но не сохраняется в буфере.
- n равно нулю
- n больше чем RSIZE_MAX
- str — нулевой указатель
- endline или eof не обнаружены после сохранения n-1 символов в буфере.
Parameters
str | — | строка символов для записи |
Return value
str в случае успеха, нулевой указатель в случае неудачи.
Если сбой был вызван состоянием конца файла,дополнительно установите параметр eof индикатор (см. feof() ) на stdin . Если сбой был вызван какой-либо другой ошибкой, устанавливает error индикатор (см. ferror() ) на stdin .
Notes
Функция gets() не выполняет проверку границ, поэтому эта функция чрезвычайно уязвима для атак переполнения буфера. Его нельзя безопасно использовать (если только программа не работает в среде, которая ограничивает то, что может появиться в stdin ) По этой причине эта функция устарела в третьем исправлении к стандарту C99 и вообще удалена в стандарте C11. fgets() и gets_s() — рекомендуемые замены.
Никогда не используйте gets() .
References
- Стандарт C11 (ISO/IEC 9899:2011):
- K.3.5.4.1 Функция get_s (стр.602-603)
- 7.19.7.7 Получает функцию (стр.298)
- 4.9.7.7 Получает функцию
Источник: runebook.dev