
- •Лабораторная работа № 9 Работа со строками
- •Постановка задачи
- •Варианты заданий
- •Методические указания к лабораторной работе
- •Справочные материалы
- •Понятие о строках
- •Строковые литералы
- •Символические строковые константы
- •Строковые переменные
- •Инициализация строковых переменных
- •Операции со строковыми переменными
- •Вывод строк
- •Вывод строк с помощью функции printf()
- •Функция puts()
- •Функция fputs()
- •Ввод строк
- •Функция scanf()
- •Функция gets()
- •Использование функции fgets() для консольного ввода строк
- •Стандартные функции для обработки строк
- •Функция strlen
- •Функция strcpy()
- •Функции strcat() и strncat()
- •Функция strcmp()
- •Функция strtok()
- •Массивы строк
- •Функции пользователя для обработки строк
- •Ввод строк
- •Вывод строк
- •Разделение строки на слова и запись полученных слов в строковый массив
- •Объединение в строку слов, содержащихся в строковом массиве
- •Контрольные вопросы
-
Функция gets()
Прототип этой функции имеет следующий вид:
#include<stdio.h> char* gets(char* str);
Рассматриваемая функция читает символы, вводимые с клавиатуры в символьный массив, на который установлен указатель str. Это чтение выполняется до тех пор, пока не встретится либо символ “новая строка” (\n), либо конец файла. После записи последнего прочитанного символа в массив str добавляется нуль – символ. Если встречается символ “новая строка”, то он отбрасывается. Если выполнение функции завершено успешно, то она возвращает указатель str. Функция gets() вернет значение NULL в том случае, когда при достижении конца файла ни один из символов не оказался прочитанным, причем содержимое массива, на который установлен указатель str, останется без изменения. Значение NULL является возвращаемым значением и в том случае, когда будет обнаружена ошибка чтения, но в этом случае содержимое массива считается не определенным. Приведем пример применения функции gets(). В этом примере вначале запрашивается имя пользователя, а затем компьютер выводит приветствие.
/* Greeting.c */ #include<stdio.h>
#include<string.h> #define MAX 81 int main(void) { char name[MAX]; char out[MAX] = “Привет, Вам ”; puts(“Введите Ваше имя”); gets(name); printf(“Привет, Вам %s”, name); puts(out);
return 0; } Протокол работы с программой greeting имеет следующий вид Введите Ваше имя Иван Привет, Вам Иван
Существенным недостатком рассматриваемой функции является возможность переполнения массива, на который установлен указатель str. В связи с этим функцию gets() не рекомендуют использовать в коммерческих приложениях. Для этих целей можно воспользоваться функцией fgets().
-
Использование функции fgets() для консольного ввода строк
В связи с тем, что функция gets() пользуется плохой репутацией, в качестве альтернативы этой функции предлагается использовать функцию файлового ввода-вывода fgets().Для обсуждения возможности использования этой функции для консольного ввода приведем прототип функции fgets():
#include<stdio.h>
char* fgets(char* str, int n, FILE* stream);
Рассматриваемая функция имеет два дополнительных параметра, которые отсутствуют у функции gets(). Первый из дополнительных параметров (int n) служит для ограничения количества символов, которые могут быть прочитаны в массив str из буфера клавиатуры. Второй дополнительный параметр (FILE stream) при использовании функции fgets() определяет файл, с которым должна работать эта функция. Для консольного ввода достаточно в ее вызове в качестве параметра stream взять имя стандартного потока, предназначенного для работы с клавиатурой (stdin).
Функция fgets() в форме, предназначенной для ввода с клавиатуры, позволяет записать в массив, на который указывает указатель str, не более n – 1 символа. Ввод прекращается, как только встретится символ новой строки (который записывается в массив) или символ конца файла. За последним введенным символом добавляется нуль-символ. В случае успешного завершения функция вернет указатель строку str. Если прочитан конец файла, а ни один символ не был введен, то содержимое массива оказывается неизменным, а функция вернет значение NULL. Если во время ввода имела место ошибка, то функция вернет значение NULL, а содержимое массива str оказывается неопределенным. Приведем пример.
#include<stdio.h> #include<string.h> #define MAXSIZE 81 int main(void) { char buf[MAXSIZE]; char* s = NULL; fgets(buf, sizeof(buf), stdin); s = strchr(buf, '\n');/* Ищем символ ‘\n’ в прочитанной строке */ if(s != NULL) *s = '\0'; /* Запись символа ‘\0’вместо символа ‘\n’ */ return 0;
}
С целью приблизить работу функции fgets() к работе функции gets(), которую она призвана заменить, в рассматриваемом примере добавлен программный код, удаляющий из массива, используемого для ввода строки (buf), символ новой строки (\n). Для этой цели используется функция strchr() и инструкция if.