Основы программирования

Глава 4 - СИМВОЛЬНЫЕ СТРОКИ - ВВЕДЕНИЕ
Индекс материала
Глава 4
СИМВОЛЬНЫЕ СТРОКИ - ВВЕДЕНИЕ
Длина строки - функция strlen( )
КОНСТАНТЫ И ПРЕПРОЦЕССОР ЯЗЫКА Си
Язык Си - искусный фокусник: создание псевдоимен
ИЗУЧЕНИЕ И ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ printf( ) И scanf( )
Использование функции printf( )
Модификаторы спецификации преобразования, используемые в функции printf( )
Использование функции printf( ) для преобразования данных
Применение функции scanf( )
СОВЕТЫ ПО ПРИМЕНЕНИЮ
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Все страницы

"Символьная строка" - это последовательность, состоящая из одного или более символов В качестве примера рассмотрим следующую строку:

"Строки изливались прямо из сердца!"

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

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

 

Необходимо отметить, что на рисунке последним элементом массива является символ \0. Это "нуль-символ", и в языке Си он используется для того, чтобы отмечать конец строки Нуль-символ - не цифра 0; он не выводится на печать и в таблице кода ASCII1) имеет номер 0. Наличие нуль-символа означает, что количество ячеек массива должно быть по крайней мере на одну больше, чем число символов, которые необходимо размещать в памяти.

Ну, а теперь спросим, что такое массив? Массив можно пред ставить себе как совокупность нескольких ячеек памяти, объединен ных в одну строку Если вы предпочитаете более формальные и строгие определения, то массив - это упорядоченная последова тельность элементов данных одного типа В нашем примере мы со здали массив из 40 ячеек памяти, в каждую из которых можно по местить один элемент типа char. Мы осуществили это с помощью оператора описания

char name [40];

Квадратные скобки указывают, что переменная name - массив, 40 - число его элементов, a char задает тип каждого элемента. (В комментариях к программе было отмечено, что при желании вы можете воспользоваться более сложным оператором описания).

static char name [40],

Ввиду некоторой специфики, связанной с реализацией функции scanf( ) в нашей системе, мы вынуждены использовать эту вторую

форму, но весьма вероятно, что вы сможете выбрать любую из них. Если обнаружится, что при работе с первой формой оператора описания у вас возникнут трудности при решении наших примеров, попробуйте воспользоваться второй В действительности вторая форма должна работать в любой системе, но мы не хотим применить тип static до тех пор, пока не рассмотрим в гл 10 понятие классов памяти).

На первый взгляд все это выглядит довольно сложным: вы должны создать массив, расположить символы в виде строки и не забыть добавить в конце \0. К счастью, о большинстве деталей компилятор может "позаботиться" сам.

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

/* похвала 1*/
#define PRAISE " Вот эта да, какое великолепное имя"
main( )
{
char name [50];
printf(" Как вас зовут? \n" );
scanf(" %s", name);
printf(" Привет, %s %s\n" , name, PRAISE);
}

Символ %s служит указанием функции printf( ) напечатать строку. Результат выполнения программы похвала 1 может выглядeть, например, так

Как вас зовут ?
Элмо Бланк Привет, Элмо, Вот эта да, какое великолепное имя !

Как видите, нам не пришлось самим помещать нуль символ в конец массива. Эта задача была выполнена за нас функцией scanf( ) при чтении вводимой строки. PRAISE - "символическая строковая константа". Ниже мы рассмотрим директиву #define более подробно, а пока вы должны знать, что кавычки, в которые за ключена фраза, следующая за строковой константой PRAISE, иден тифицируют эту фразу как строку, и поэтому в ее конец будет помещен нуль-символ.

Заметим (и это очень важно), что функция scanf( ) при вводе строки "Элмо Бланк" читает только имя Элмо. Дело в том, что, встретив какой-нибудь разделитель (пробел, символ табуляции или перевода строки), функция scanf( ) прекращает ввод символов, т е в данном случае она прекращает опрос переменной name в тот момент, когда доходит до пробела между "Элмо" и "Бланк". Вообще говоря, функция scanf( ) вводит только одиночные слова, а не целую фразу в качестве строки. Для чтения входной информации в языке Си имеются другие функции, например функция gets( ), предназначенная для обработки строк общего вида. Более полно работу со строками мы рассмотрим в последующих главах.

Необходимо заметить также, что строка "х" не то же самое, что символ 'x'. Первое различие: 'х' - объект одного из основных типов (Char), в то время как "х" - объект производного типа (массива элементов типа char). Второе различие: "х" на самом де ле состоит из двух символов - символа 'x' и нуль-символа.