logo
Подбельский Фомин_Программирование на языке СИ_

Строки, или строковые константы.

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

Строки уже многократно встречались в функциях printf( ) и scanf( ).

Однако у строк есть некоторые особенности. Транслятор отводит каждой строке отдельное место в памяти ЭВМ даже в тех случаях, когда несколько строк полностью совпадают (стандарт языка Си предполагает, что в конкретных реализациях это правило может не выполняться). Размещая строку в памяти, транслятор автоматически добавляет в ее конце символ '\0', т.е. нулевой байт. В записи строки может быть и один символ: "А", однако в отличие от символьной константы 'А' (использованы апострофы) длина строки ".А" равна двум байтам. В отличие от других языков (например, от Паскаля) в языке Си нет отдельного типа для строк. Принято, что строка - это массив символов, т.е. она всегда имеет тип char[ ]. Таким образом, строка считается значением типа "массив символов". Количество элементов в таком массиве на 1 больше, чем в изображении соответствующей строковой константы, так как в конец строки добавлен нулевой байт '\0'.

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

При определении массива типа char с одновременной инициализацией можно не указывать пределы изменения индекса. Сказанное иллюстрирует следующая программа:

Результат выполнения программы:

.

В программе длина массива В - 17 элементов, т.е. длина строки, помещаемой в массив (16 символов), плюс нулевой байт окончания строки. Именно 17 байтов выделяется при инициализации массива в приведенном примере. Инициализация массива символов с помощью строковой константы представляет собой сокращенный вариант инициализации массива и введена в язык для упрощения. Можно воспользоваться обычной инициализацией, поместив начальные значения элементов массива в фигурные скобки и не забыв при этом поместить в конце списка начальных значений специальный символ окончания строки '\0'. Таким образом, в программе была бы допустима такая инициализация массива В:

Соглашение о признаке окончания строки нужно соблюдать, формируя в программах строки из отдельных символов. В качестве примера рассмотрим следующую задачу: "Ввести предложение, заканчивающееся точкой, слова в котором отделены пробелами. Напечатать последнее слово предложения".

Анализ условия задачи позволяет выявить следующие ошибочные ситуации и особые случаи: отсутствие точки в конце предложения; пробел или пробелы перед первым словом предложения; несколько пробелов между словами; пробелы перед завершающей предложение точкой; отсутствие слов в предложении (только точка). Чтобы не усложнять решение задачи, примем соглашение о том, что вводимое предложение всегда размещается на одной строке дисплея, т.е. длина его не превышает 80 символов. Это позволит легко выявлять отсутствие точки в конце предложения и ограничивает длину любого слова предложения. Чтобы учесть особые ситуации с пробелами, необходимо при анализе очередного введенного символа (переменная s) рассматривать и предыдущий символ (переменная ss). Для выявления отсутствия слов в предложении будем вычислять длину k каждого очередного вводимого слова. Если k == 0, а вводится символ '.', то это признак пустого предложения.

Текст программы:

Чтение вводимых данных выполняется посимвольно в цикле с параметром i. Если вводится пробел, то оператор continue вызывает переход к следующей итерации. Если введена точка, то цикл прерывается. При этом в первых k элементах массива А[] запоминается последнее слово предложения. Если введенный символ отличен от точки и пробела, то анализируется предыдущий символ. Если это пробел, то начинается ввод следующего слова и устанавливается нулевое значение k. В следующих операторах введенный символ записывается в k-й элемент массива А и k увеличивается на 1. Выход из цикла возможен при появлении точки или после ввода 80 символов. Последнее выполняется при отсутствии в предложении точки. В этом ошибочном случае i = = 80. Когда в предложении нет слов, k остается равным нулю. Если i<80 и k не равно 0, то в k-й элемент массива А записывается признак конца строки (последнего слова предложения), и она как единое целое выводится на печать.

Результат выполнения программы:

Как еще раз иллюстрирует приведенная программа, работа с символьными строками - это работа с массивами типа char. При этом следует обращать внимание на обязательное присутствие в конце строки (в последнем занятом элементе массива) символа '\0' и не допускать его случайного уничтожения при обработке.

В качестве следующей задачи рассмотрим проверку вводимой цифровой информации: "Необходимо, введя строку, напечатать порядковый номер (позицию) каждого символа, который отличен от пробела или цифры". Задачу решает следующая программа:

В программе (в цикле по i) выполняется ввод отдельных символов до появления неизображаемого символа '\n' - перевод строки. Каждый введенный символ s сравнивается в цикле по j с элементами массива z, содержащего все допустимые символы. Если выявлено совпадение, то при выходе из цикла j не равно 11. При естественном завершении цикла (не найдено совпадения) j оказывается равным 11, и печатается номер ошибочного символа.

Пример результата выполнения программы: