ТОП 10:

Символические строковые константы



Возможны три вида строковых констант. Во-первых, символическая строковая константа может быть представлена в виде символического строкового литерала. Такой подход предполагает использование директивы препроцессора define. Например:

# define GREETING “Hello, world”

Во-вторых, строковый литерал может использоваться для инициализации константного указателя. Например:

const char* const ptr_greeting = “Hello, world”;

В определении указателя ptr_greeting дважды используется зарезервированное слово const. Первое из этих слов, с которого и начинается определение, запрещает изменять символы строкового литерала, а втрое запрещает изменять значение самого указателя.

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

const char greeting[] = “Hello, world”;

Строковые переменные

Строковая переменная – массив символов, содержащий последовательность символов, которая заканчивается нуль-символом. Рассмотрим следующий программный код:

#define MAXLENGTH 129
/* ... */

char str1[MAXLENGTH];

Для переменной str1 выделяется память объемом в 129 байт. Потенциально такая переменная может работать со строками, длина которых не превосходит 128 символов. Особенность рассматриваемой переменной состоит в отсутствии явной инициализации. Неявная инициализация этой переменной будет иметь место в том случае, когда ее определение будет находиться вне тела функции. В этом случае массив str1 будет инициализирован нулями, а сама переменная может рассматриваться как пустая строка. В противном случае переменная str1 будет содержать “мусор” и не может использоваться в качестве строки. Это делает целесообразным явно инициализировать строки при их объявлении.

Инициализация строковых переменных

Возможны два способа инициализации строковой переменной при ее определении:

· инициализация строковым литералом,

· инициализация массивом символов.

Приведем примеры явной инициализации строковых переменных при их определении.

Пример 1.

#define MAXLENGTH 129
char str1[MAXLENGTH] = “Hello”;

В этом примере для хранения элементов массива str1 предусмотрено выделение 129 байт памяти, в начало которой будет скопирован строковый литерал. Нуль-символ (\0) в массив str1 будет занесен автоматически.

Пример 2.

#define MAXLENGTH 129
char str2[MAXLENGTH] = “ ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’”;

Второй пример отличается от первого только способом инициализации. Здесь для инициализации используется массив символов. Нуль-символ в этом случае должен быть включен в число инициализаторов.

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

Следует отметить, что инициализировать строковую переменную можно только в момент определения. Следующий код содержит ошибку:

Пример 3.

#define MAXLENGTH 129
char str3[MAXLENGTH];
str3 = “Hello”; /* Синтаксическая ошибка*/

Здесь имеет место попытка изменить значение константного указателя, которым является str3.

Операции со строковыми переменными

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

Для работы с библиотечными функциями следует подключить стандартный заголовочный файл string.h.

Вывод строк

Для ввода строк с клавиатуры можно воспользоваться следующими библиотечными функциями:

· printf(),

· puts(),

· fputs().

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

Вывод строк с помощью функции printf()

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

printf(“Hello, world”);

В более сложных случаях следует при выводе строк использовать спецификацию типа s. В качестве примера приведем вывод заголовка таблицы:

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

Здесь также необходимо выводить строковые литералы. Однако форматирование вывода лучше предоставить компилятору, а не выполнять вручную в форматной строке.

Теперь приведем пример, в котором будет выводиться строковая переменная:

#include<stdio.h>
#define MAXLENGTH 129
int main(void)
{
char st[MAXLENGTH] = “”;
/* Работа со строкой st */
printf(“%s\n”, st);
}

Функция puts()

Объявление функции puts() имеет следующий вид

#include<stdio.h>
int puts(const char* str);

Функция puts() выводит на экран дисплея строку, на которую установлен указатель str. Нуль – символ этой строки преобразуется в символ новой строки, который выводится на экран. Последнее приводит к тому, что после вывода строки str курсор перейдет на начало новой строки экрана.

При успешном выполнении функция puts() возвращает неотрицательное число, а в случае сбоя – значение EOF.

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

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

 

/* Демонстрация вывода строк с применением функции puts()*/

/* Файл puts.c */

#include<stdio.h>
int main(void)
{
char* msg1 = “Не”;
char* msg2 = “применяйте”;
char* msg3 = “функцию”;
char* msg4 = “gets()”;
char* msg5 = “в коммерческих”;
char* msg6 = “приложениях!!!”;
puts(msg1);
puts(msg2);
puts(msg3);
puts(msg4);
puts(msg5);
puts(msg6);
return 0;
}

Результат выполнения программы будет иметь следующий вид:


Не
применяйте
функцию
gets()
в коммерческих
приложениях!!!

 

Функция fputs()

Функция fputs() предназначена для работы с файлами. Она не имеет особых преимуществ перед функцией puts(), которая используется для консольного вывода строк. Ее целесообразно применять совместно с функцией ввода строк fgets(). Функция fgets() имеет очевидные преимущества перед функцией gets(), специально предназначенной для консольного ввода строк. Это и делает оправданным рассмотрение этой функции.

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

#include<stdio.h>
int fputs(const char*s, FILE* stream);

 

Рассматриваемая функция имеет один дополнительный параметр, которого нет у функции puts().Этот дополнительный параметр (FILE* stream) при использовании функции fgets() определяет файл, с которым должна работать эта функция. Для консольного ввода достаточно в ее вызове в качестве параметра stream использовать имя стандартного потока, предназначенного для работы с клавиатурой (stdout).

Эта функция (в том случае, когда она вызвана со вторым параметром, равным stdout), выводит на экран дисплея строку символов, на которую установлен указатель s. При этом нуль-символ, которым заканчивается выводимая строка отбрасывается. В отличие от puts() функция fputs() не дополняет выводимую строку символом “новая строка”. Если во время вывода строки имеет место ошибка, то функция fputs() вернет значение EOF. При успешном завершении рассматриваемой функции возвращается неотрицательное число.

Ввод строк

Для ввода строк с клавиатуры можно воспользоваться следующими библиотечными функциями:

· scanf(),

· gets(),

· fgets().

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

Функция scanf()

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

Пример 4.

#define MAXLENGTH 129
#include<stdio.h>

int main(void)
{
char st[MAXLENGTH];
prinf(“Enter a string: ”);
scanf(“%s”, st);
printf(“%s”, st);
/* */
return 0;
}

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

Enter a string: Hello, world<Enter>

Hello,

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

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

Пример 5.

#define MAXLENGTH 129
#include<stdio.h>

int main(void)
{
char st[MAXLENGTH];
prinf(“Enter a string: ”);
scanf(“%5s”, buffer);
printf(“%s”, buffer);
/* */
return 0;
}

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

Enter a string: 1234567890<Enter>

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

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

Пример 6.

#include<stdio.h>

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

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

Функция 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)
{
charname[MAX];
charout[MAX] = “Привет, Вам ”;
puts(“Введите Ваше имя”);
gets(name);
printf(“Привет, Вам %s”, name);
puts(out);

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

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







Последнее изменение этой страницы: 2016-04-26; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.223.3.101 (0.01 с.)