Программирование на C и C++

Онлайн справочник программиста на C и C++

Чтение и запись строк: gets() и puts()

Функции gets() и puts() позволяют читать и выводить строки на консоль.

Функция gets() читает строку символов, введенных с клавиатуры и помещает их по адресу, указанному в аргументе. Можно набирать символы, пока не будет нажат ввод. Символ, соответствующий клавише ввод - возврат каретки, - не станет частью строки. Вместо этого в конце строки появится нулевой символ, и gets() закончит работу. Фактически невозможно использовать gets() для получения возврата каретки (можно использовать getchar() и ее варианты). Если при вводе допущены ошибки, то они могут быть исправлены нажатием на клавишу BACKSPASE перед нажатием ввода. Функция gets() имеет прототип:

char *gets(char *str);

где str - это массив символов. Функция gets() возвращает указатель на str. Следующая программа осуществляет чтение строки в массив str и выводит ее длину:

#include <stdio.h>
#include <string.h>
int main(void)
{
char str[80];
gets(str);
printf("Length is %d", strlen(str));
return 0;
}

Имеется проблема, связанная с gets(), о которой следует знать: используя gets(), можно перейти границы массива, с которым она вызывалась. Это возможно, поскольку не существует способа указать gets(), где находится граница массива. Например, если вызвать gets() с массивом длиной в 40 байт, а затем ввести 40 или более символов, то произойдет выход за пределы массива. Это, естественно, вызывает проблемы и часто может привести к краху системы. В качестве альтернативы можно использовать функцию fgets() (описываемую далее), которая позволяет указать максимальную длину. Единственная проблема, связанная с fgets(), заключается в том, что она сохраняет символ новой строки. Если этот символ не нужен, то следует удалить его вручную. Возможно, в будущем будет осуществлена замена gets(), но на сегодняшний день данная функция предоставляет самый легкий способ чтения строки с клавиатуры, надо просто быть внимательным.

Функция puts() выводит передаваемый ей аргумент на экран, завершая вывод переходом на новую строку. Она имеет следующий прототип:

int puts(const char *str);

Здесь str - это выводимая строка. Функция возвращает нецелое число в случае удачи и EOF - в случае неудачи. Она понимает коды с обратным слэшем, как и printf(), например \t воспринимается как табуляция. Вызов функции puts() требует гораздо меньше процессорного времени на реализацию, чем printf(), поскольку puts() выводит только строку символов. Она не может выводить числа или выполнять преобразование форматов. Она занимает, меньше места и работает быстрее printf(). Следующий оператор выводит «hello» на экран:

puts("hello");

Простейшие функции, выполняющие операции консольного ввода/вывода, приведены в таблице.

Таблица: Основные функции консольного ввода/вывода
Функция Операция
getchar() Читает символ с клавиатуры, ожидает нажатия ввода
getche() Читает символ с эхом, не ожидает нажатия ввода, не определена в стандарте ANSI С, но является типичным расширением
getch() Читает символ без эха, не ожидает нажатия ввода, не определена в стандарте ANSI С, но является типичным расширением
putchar() Выводит символ на экран
gets() Читает строку с клавиатуры
puts() Выводит строку на экран