Давайте рассмотрим короткую программу (листинг 11.1), которая иллюстрирует несколько способов представления строк.
Листинг 11.1. Программа strings1.с

Подобно printf(), функция puts() принадлежит семейству функций ввода-вывода stdio.h. Она отображает только строки и, в отличие от printf(), автоматически добавляет к выводимой строке символ новой строки. Ниже показан вывод этой программы:
Вот несколько строк:
Я - старомодная символьная строковая константа.
Я являюсь строкой, хранящейся в массиве.
Что-то указывает на меня.
Я являюсь строфой, хранящейся в массиве.
Вместо того чтобы анализировать листинг 11.1 строка за строкой, мы примем другой подход. Первым делом мы рассмотрим способы определения строки в программе. Затем мы выясним, как осуществляется чтение строки в программе. И, наконец, мы исследуем методы для вывода строк.
Символьные строки и строковые функции 421
Определение строк в программе
Во время просмотра листинга 11.1 вы, скорее всего, заметили, что существует много способов определения строк. К основным методам относится использование строковых констант, массивов типа char и указателей на тип char. Программа должна обеспечить место для хранения строки, и эту тему мы также обсудим.
Символьные строковые литералы (строковые константы)
Строковый литерал, который также называют строковой константой, представляет собой произвольную последовательность символов, помещенную в двойные кавычки. Заключенные в кавычки символы, а также завершающий символ \0, который автоматически добавляется компилятором, хранятся в памяти как символьная строка. Таким образом, "Я - символьная строковая константа.", "Я являюсь строкой, хранящейся в массиве.", "Что-то указывает на меня." и "Вот несколько строк:"— все это строковые литералы.
Вспомните, что, начиная со стандарта ANSI С, выполняется конкатенация строковых литералов, если они отделены друг от друга ничем, кроме пробельных символов. Например, определение
char greeting[50] = "Здравствуйте, "" как вы себя" " чувствуете"
" сегодня?";
эквивалентно следующему определению:
char greeting[50] = "Здравствуйте, как вы себя чувствуете сегодня?";
Если вы хотите применить двойные кавычки в строке, предварите их обратной косой чертой:
printf("\"Беги, Спот, беги!\" - воскликнул Дик.\n");
Вывод будет таким:
"Беги, Спот, беги!" - воскликнул Дик.
Символьные строковые константы размещаются в статическом классе хранения, т.е. если вы используете строковую константу в функции, то эта строка сохраняется только однажды и существует на протяжении времени выполнения программы, даже если функция вызывается много раз. Вся фраза, заключенная в кавычки, действует в качестве указателя на место, где хранится строка. Это аналогично имени массива, которое трактуется как указатель на место размещения массива. Если сказанное верно, то какой вывод должна сгенерировать программа в листинге 11.2?
Листинг 11.2. Программа strptr.c

Формат %s должен вывести строку Мы. Формат %р выводит адрес. Таким образом, если фраза " - " является адресом, то формат %р должен обеспечить вывод адреса первого символа в этой строке. (В реализациях, предшествующих стандарту ANSI С, может понадобиться заменить %р спецификатором %u или %lu.)
422 глава 11
Наконец, выражение * "космические бродяги" должно дать значение, на которое указывает адрес и которым будет первый символ строки "космические бродяги". Так ли это на самом деле? Взглянем на вывод:
Мы, 0xl00000f61, к
Массивы символьных строк и инициализация
Когда вы определяете массив символьных строк, то должны сообщить компилятору, сколько для него необходимо выделить памяти. Один из способов предусматривает указание размера массива, достаточного для хранения строки. Следующее объявление инициализирует массив ml символами заданной строки:
const char ml[40] = "Постарайтесь уложиться в одну строку.";
Ключевое слово const отражает намерение не изменять эту строку.
Показанная форма является сокращением для стандартной формы инициализации массива:

Обратите внимание на завершающий нулевой символ. Без него вы получите символьный массив, а не строку.
Читать дальше