Функции библиотеки 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: базовое использование — чтение строки

Пример

#include <stdio.h>

int main()
{
   char str[50];

   printf("Пожалуйста, введите строку: ");
   gets(str);

   printf("Введённая вами строка: %s", str);

   return(0);
}

Ожидаемый вывод:

请输入一个字符串:example
您输入的字符串是:example

Анализ кода:

  1. #include <stdio.h>заключается в использованииgets()Предварительное условие функции.
  2. char str[50];Он определяет массив символов длиной 50 для хранения входной строки.
  3. gets(str);Он читает строку из стандартного ввода и сохраняет её вstrВ.
  4. printf("您输入的字符串是:%s", str);Использование%sспецификаторы формата выводят строки.

Пример 2: Обработка случая, когда возвращаемое значение равно NULL

В реальном программировании следует проверятьgets()возвращаемое значение, чтобы обрабатывать возможные ошибки.

Пример

#include <stdio.h>

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()является небезопасным.

Пример

#include <stdio.h>

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(), потому что она позволяет указать размер буфера.

Пример

#include <stdio.h>

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()Преимущества:

  • Она позволяет указать максимальное количество символов для чтения, предотвращая переполнение буфера.
  • Он сохраняет символ новой строки в конце строки (при необходимости его можно удалить вручную).
  • Он может указывать источник ввода (стандартный ввод, файл и т. д.).

Стандартная библиотека C - <stdio.h>

Другие расширения