Стивен Прата - Язык Си - руководство для начинающих стр 17.

Шрифт
Фон

На первый взгляд все это выглядит довольно сложным: вы должны создать массив, расположить символы в виде строки и не забыть добавить в конце \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' и нуль-символа.

РИС.4.3. Символ 'х' и строка "х"

Длина строки - функция strlen( )

sizeofstrlen( )

/*похвала 2*/

#define PRAISE " Вот это да, какое великолепное имя!"

main( )

{

char name [50];

printf(" Как вас зовут?\n");

scanf(" %s", name);

printf(" Привет, %s. %s\n" , name, PRAISE);

printf(" Ваше имя состоит из %d букв и занимает %d ячеек памяти. \n",

strlen (name), sizeof name);

printf(" Хвалебная фраза состоит из %d букв", strlen (PRAISE));

printf(" и занимает %d ячеек памяти. \n", sizeof PRAISE);

}

Заметим, что случайно мы воспользовались двумя методами для обработки длинных операторов printf(). В первом случае мы, записав один оператор печати в двух строках программы. Мы сделали это, поскольку разрешается разбивать строку между аргументами, но не посередине строки. В другом случае использовались два оператора printf() для печати одной строки; мы указали символ "новая строка" (\n) только во втором из них. Представленный ниже результат работы данной программы поможет понять подобную ситуацию:

Как вас зовут ?

Перки

Привет, Перки. Вот это да, какое великолепное имя!

Ваше имя состоит из 5 букв и занимает 50 ячеек памяти.

Хвалебная фраза состоит из 35 букв и занимает 36

ячеек памяти.

Давайте посмотрим, в чем дело. Массив name занимает 50 ячеек памяти, и именно об этом сообщает операция sizeof. Но для хранения имени Перки требуются только первые пять ячеек, и как раз об этом нас информирует функция strlen( ). В шестой ячейке массива name содержится нуль-символ, и его появление служит сигналом для функции strlen( ) прекратить подсчет символов

РИС.4.4. Распознавание функцией strlen( ) конца строки

При переходе к обработке константы PRAISE обнаруживается, что функция strlen( ) опять дает нам точное число символов (включая пробелы и знаки пунктуации) в строке. Результат операции sizeof оказывается на единицу большим, поскольку при этом учитывается и "невидимый" нуль-символ, помещенный в конец строки. Мы не указываем компилятору, какой объем памяти он должен отвести для размещения всей фразы, он сам подсчитывает число символов между кавычками.

Еще одно замечание в предыдущей главе была использована операция sizeof со скобками, а в этой - без них. Решение, использовать ли скобки или нет, зависит от того, что вы хотите знать объем памяти, отводимый под элементы конкретного типа, или объем памяти, занимаемый определенным объектом В первом случае вы писали бы sizeof(char) или sizeof(float), а во втором - sizeof name или sizeof 6.28.

КОНСТАНТЫ И ПРЕПРОЦЕССОР ЯЗЫКА Си

circ = 3.14 * diameter;

Приведенная здесь константа 3. 14 - известное число Пи. Чтобы ввести ту или иную константу в программу, нужно указать ее фактическое значение, как было сделано выше. Однако существуют веские причины использовать вместо этого "символические константы", например, мы могли бы применять оператор

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке