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

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

В предыдущей главе мы практически без объяснений использовали операцию sizeof, которая дает нам размер объектов в байтах Функция strlen( ) позволяет определять длину строки числом символов. Поскольку для размещения одного символа в памяти отводится 1 байт, можно было бы предположить, что в результате применения любой из этих двух операций к одной строке будет получен одинаковый результат. Оказыватся, это не так. Давайте немного изменим нашу предыдущую программу (добавим к ней несколько строк), и тогда мы поймем, в чем дело.

/*похвала 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(). В первом случае мы записав один оператор печати в двух строках программы2) . Мы сделали это, поскольку разрешается разбивать строку между аргументами, но не посередине строки. В другом случае использовались два оператора printf() для печати одной строки; мы указали символ "новая строка" (\n) только во втором из них. Представленный ниже результат работы данной программы поможет понять подобную ситуацию:

Как вас зовут ?
Перки
Привет, Перки. Вот это да, какое великолепное имя!
Ваше имя состоит из 5 букв и занимает 50 ячеек памяти.
Хвалебная фраза состоит из 35 букв и занимает 36 ячеек памяти.

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

 

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

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

В данном разделе операции strlen( ) и sizeof использовались только для удовлетворения нашего любопытства, в действительности они представляют собой важные программные средства Функция strlen( ), например, полезна в любого сорта программах обра ботки строк или символов, в чем вы сможете убедиться, ознакомившись с гл 13. Приступим теперь к рассмотрению директивы #define.



 
семена почтой . Меховые накидки для авто подробности здесь.