Перечислим основные новые черты этой программы:
1. Мы использовали "массив" для хранения "символьной строки" - в данном случае для некоторого имени.
2. При вводе и выводе строки была использована "спецификация преобразования" %s
.3. Для определения символической константы DENSITY
был использован препроцессор языка Си.4. Для нахождения длины строки была использована функция strlen( )
.СИМВОЛЬНЫЕ СТРОКИ - ВВЕДЕНИЕ
"Символьная строка" - это последовательность, состоящая из одного или более символов В качестве примера рассмотрим следующую строку:
"Строки изливались прямо из сердца!"
Кавычки не являются частью строки. Они вводятся только для того, чтобы отметить ее начало и конец, т.е. играют ту же роль, что и апострофы в случае одиночного символа.
В языке Си нет специального типа, который можно было бы использовать для описания строк Вместо этого строки представля ются в виде "массива" элементов типа char
. Это означает, что символы в строке можно представить себе расположенными в со седних ячейках памяти - по одному символу в ячейке (рис. 41).РИС. 4. 1. Строка как массив ячеек
Необходимо отметить, что на рисунке последним элементом массива является символ \0
. Это "нуль-символ", и в языке Си он используется для того, чтобы отмечать конец строки Нуль-символ - не цифра 0; он не выводится на печать и в таблице кода ASCII имеет номер 0. Наличие нуль-символа означает, что количество ячеек массива должно быть по крайней мере на одну больше, чем число символов, которые необходимо размещать в памяти.Ну, а теперь спросим, что такое массив? Массив можно пред ставить себе как совокупность нескольких ячеек памяти, объединен ных в одну строку Если вы предпочитаете более формальные и строгие определения, то массив - это упорядоченная последова тельность элементов данных одного типа В нашем примере мы создали массив из 40 ячеек памяти, в каждую из которых можно по местить один элемент типа char
. Мы осуществили это с помощью оператора описанияКвадратные скобки указывают, что переменная name
- массив, 40 - число его элементов, a char задает тип каждого элемента. (В комментариях к программе было отмечено, что при желании вы можете воспользоваться более сложным оператором описания):Ввиду некоторой специфики, связанной с реализацией функции scanf( )
в нашей системе, мы вынуждены использовать эту вторую
РИС.4.2. Описание имени массива типа char
форму, но весьма вероятно, что вы сможете выбрать любую из них. Если обнаружится, что при работе с первой формой оператора описания у вас возникнут трудности при решении наших примеров, попробуйте воспользоваться второй. В действительности вторая форма должна работать в любой системе, но мы не хотим применить тип static
до тех пор, пока не рассмотрим в гл. 10 понятие классов памяти).На первый взгляд все это выглядит довольно сложным: вы должны создать массив, расположить символы в виде строки и не забыть добавить в конце \0
. К счастью, о большинстве деталей компилятор может "позаботиться" сам.Попробуйте выполнить приведенную ниже программу, чтобы посмотреть, как просто все происходит на практике:
Символ %s
служит указанием функции printf( ) напечатать строку. Результат выполнения программы похвала 1 может выглядeть, например, так:Как видите, нам не пришлось самим помещать нуль символ в конец массива. Эта задача была выполнена за нас функцией scanf( )
при чтении вводимой строки. PRAISE - "символическая строковая константа". Ниже мы рассмотрим директиву #define более подробно, а пока вы должны знать, что кавычки, в которые заключена фраза, следующая за строковой константой PRAISE, идентифицируют эту фразу как строку, и поэтому в ее конец будет помещен нуль-символ.