Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык Си. Лабораторные работы / Справочник. Часть 2 (СПбГУТ).doc
Скачиваний:
49
Добавлен:
10.09.2019
Размер:
801.79 Кб
Скачать

1.38.5.Строковые функции стандарта с11

Функции, традиционно используемые в языке Си для работы со строками, не проверяют размер массива, в котором хранится строка. Это приводит к возникновению ошибок в работе программы и к понижению ее безопасности (к повышению опасности заражения компьютерным вирусом).

Приложение К стандарта С11 содержит описания альтернативных функций, которые обеспечивают более безопасное программирование. Эти функции проверяют достаточно ли велик выходной буфер для ожидаемого результата, и возвращают признак ошибки, если это не имеет места. Например, в этом приложении определены функции strcpy_s(), strcat_s(), strncat_s(), которые предназначены для замены функций strcpy(), strcat() и strncat().

1.38.6. Ввод и вывод строк

Наиболее просто организовать вывод строк. Для этого можно использовать функции puts() и printf().

Функция puts.

int puts(const char* str);

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

Функция printf.

Строки могут выводиться с помощью библиотечной функции printf(). Рекомендуется в целях обеспечения безопасности всегда использовать спецификацию преобразования типа s [8].

Примеры.

printf(“%s”, “Hello, world”);

printf(“%5s%10s%10s”, “НОМЕР”, “АРГУМЕНТ”, “ФУНКЦИЯ”);

Не рекомендуется выводить строки без указания спецификации преобразования. Например,

printf(“Hello, world”);

Перейдем к рассмотрению средств ввода строк.

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

• scanf(),

• gets(),

• fgets().

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

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

Пример.

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

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

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”, st); printf(“%s”, st); /* */ return 0; }

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

Enter a string: 1234567890<Enter>

12345

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

Функция gets.

Прототип этой функции имеет следующий вид:

char* gets(char* s);

Функция читает символы, вводимые с клавиатуры, в символьный массив s. Чтение заканчивается, когда встретится либо символ “новая строка” (\n), либо конец файла. После записи последнего прочитанного символа в массив s добавляется нуль-символ. Если встречается символ “новая строка”, он отбрасывается. При успешном завершении функция возвращает указатель s. При достижении конца файла, когда не прочитан еще ни один символ, функция вернет значение NULL, а содержимое массива, на который установлен указатель s, останется без изменения. При обнаружении ошибки чтения функция вернет NULL, а содержимое массива считается не определенным.

Приведем пример применения функции gets().

#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;

} Протокол работы с программой.

Введите Ваше имя Иван Привет Вам, Иван

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