Функции библиотеки C -gets()
Стандартная библиотека C - <stdio.h>
В языке C,gets()Это классическая функция, используемая для чтения строк из стандартного ввода. Хотя она проста в использовании, необходимо учитывать вопросы безопасности.
gets()функция изстандартного ввода stdinОна читает строку и сохраняет её в указанный массив символов. Она читает символы до тех пор, пока не встретится символ новой строки или конец файла.
Важное предупреждение:gets()У неё серьёзные уязвимости безопасности, и она не позволяет указать размер буфера, что легко может привести к переполнению буфера. Поэтому в современном программировании на C,fgets()является лучшим выбором.
Определения слов:getозначает "get",sобозначает "string", а вместе они означают "get string".
Базовый синтаксис и параметры
gets()Это функция из стандартной библиотеки C, и для её использования требуется подключить заголовочный файл.<stdio.h>。
Формат синтаксиса
char *gets(char *str);
Описание параметра
- Параметр:
str- Тип:
char *(указатель на массив символов) - Описание: указатель на массив символов, который используется для хранения считанной C-строки. Вам нужно убедиться, что массив достаточно велик, чтобы вместить входную строку.
- Тип:
Описание функции
- Возвращаемое значение: В случае успеха возвращает указатель на
strуказатель. Если возникает ошибка или достигается конец файла без чтения каких-либо символов, она возвращаетNULL。 - Действие: Считанная строка (не включая символ новой строки) будет сохранена в
strмассив, на который указывает указатель, и нулевой символ автоматически добавляется в конец.\0в качестве терминатора строки.
Пример
Давайте освоим на примерахgets()Использование.
Пример 1: базовое использование — чтение строки
Пример
int main()
{
char str[50];
printf("Пожалуйста, введите строку: ");
gets(str);
printf("Введённая вами строка: %s", str);
return(0);
}
Ожидаемый вывод:
请输入一个字符串:example 您输入的字符串是:example
Анализ кода:
#include <stdio.h>заключается в использованииgets()Предварительное условие функции.char str[50];Он определяет массив символов длиной 50 для хранения входной строки.gets(str);Он читает строку из стандартного ввода и сохраняет её вstrВ.printf("您输入的字符串是:%s", str);Использование%sспецификаторы формата выводят строки.
Пример 2: Обработка случая, когда возвращаемое значение равно NULL
В реальном программировании следует проверятьgets()возвращаемое значение, чтобы обрабатывать возможные ошибки.
Пример
int main()
{
char str[100];
char *result;
printf("Введите какой-нибудь текст (нажмите Ctrl+D, чтобы завершить):\n");
result = gets(str);
if (result != NULL) {
printf("Успешно прочитано, содержимое:\n%s\n", str);
} else {
printf("Ошибка чтения или достигнут конец файла!\n");
}
return(0);
}
Анализ кода:
gets()Он возвращает указатель на ту же строку; в случае сбоя он возвращаетNULL。- Когда пользователь нажимает Ctrl+D (Linux/Mac) или Ctrl+Z (Windows), срабатывает условие конца файла,
gets()returnNULL。 - В реальных проектах рекомендуется использовать более безопасную
fgets()Альтернативаgets()。
Пример 3: Проблемы безопасности gets() (⚠️ Демонстрация опасных операций)
Следующий пример показывает, почемуgets()является небезопасным.
Пример
int main()
{
// Примечание: этот пример опасен и предназначен только для демонстрации!
char buffer[10];
printf("Пожалуйста, введите более длинную строку (более 10 символов):\n");
gets(buffer); // Нет проверки границ, может вызвать переполнение буфера
printf("Вы ввели: %s\n", buffer);
return(0);
}
Анализ кода:
buffer[10]Выделяется только 10 байт пространства.- Если пользователь вводит строку, превышающую 9 символов (плюс завершающий
\0), это вызоветпереполнение буфера, может перезаписать соседние области памяти. - Это может быть использовано злоумышленниками для выполнения вредоносного кода; поэтому,
gets()Она была помечена как устаревшая в стандарте C99 и даже была удалена в стандарте C11.
Лучшая альтернатива: fgets()
Настоятельно рекомендуется использоватьfgets()вместо этогоgets(), потому что она позволяет указать размер буфера.
Пример
int main()
{
char str[50];
printf("Пожалуйста, введите строку: ");
// fgets(буфер, размер буфера, файловый поток)
fgets(str, sizeof(str), stdin);
// Удалить символ новой строки, прочитанный fgets
// Метод: найти символ новой строки и заменить его нулевым символом
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == '\n') {
str[i] = '\0';
break;
}
}
printf("Введённая строка: %s\n", str);
return(0);
}
fgets()Преимущества:
- Она позволяет указать максимальное количество символов для чтения, предотвращая переполнение буфера.
- Он сохраняет символ новой строки в конце строки (при необходимости его можно удалить вручную).
- Он может указывать источник ввода (стандартный ввод, файл и т. д.).
Другие расширения