Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
134
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
    1. Ввод строк

Имеется ряд библиотечных функций, помощью которых можно выполнять ввод строк:

  • scanf(),

  • gets(),

  • fgets().

Начнем рассмотрение с функции scanf().

      1. Функция scanf()

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

#define MLEN 129 #include<stdio.h> int main(void) { char st[MLEN]; prinf(“Enter a string: ”); scanf(“%s”, st); printf(“%s”, st); /* */ return 0; }

Следует учитывать, что переменная st является указателем и при ее передаче в функцию scanf() оператор взятия адреса & не нужен. Протокол работы с программой, приведенной выше, будет иметь следующий вид:

Enter a string: Hello, world<Enter>

Hello,

Выше с помощью подчеркивания выделен ввод пользователя. Из протокола видно, что введенным оказалось только первое слово (Hello,).

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

#define MLEN 129 #include<stdio.h> int main(void) { char st[MLEN]; prinf(“Enter a string: ”); scanf(“%5s”, buffer); printf(“%s”, buffer); /* */ return 0; }

Протокол работы с программой, приведенной выше, будет иметь следующий вид:

Enterastring:1234567890<Enter>

12345

В этом примере спецификация преобразования содержит дополнительный параметр в виде числового литерала (5). В рассматриваемом случае воспринимается не более 5 вводимых символов.

Отметим, что при организации ввода строк программист обязан предусмотреть выделение памяти для вводимой строки. Ниже приведен пример, в котором отсутствует выделение памяти для вводимой строки.

#include<stdio.h> int main(void) { char *s; prinf(“Enter a string: ”); scanf(“%5s”, s); /* Ошибка*/ printf(“%s”, s); /* */ return 0; }

Ошибка состоит в том, что используется неинициализированный указатель s.

      1. Опасная функция 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);

return0; }Протокол работы с программой greeting имеет следующий вид Введите Ваше имя Иван Привет, Вам Иван

Существенным недостатком рассматриваемой функции является возможность переполнения массива, на который установлен указатель str. В связи с этим функцию gets() не рекомендуют использовать в коммерческих приложениях. Для этих целей можно воспользоваться функцией fgets().