Функцию put1.с можно рассматривать как модель для написания функций обработки строк. Поскольку каждая строка содержит нулевой символ, обозначающий ее конец, передавать функции размер строки не нужно. Вместо этого функция обрабатывает символы по очереди, пока не встретит нулевой символ.
Несколько более длинный код функции предусматривает использование формы записи с массивом:
int i = 0;
while (string [i] ! = '\0') putchar(string[i++]);
Здесь требуется дополнительная переменная для индекса.
Многие программисты на С будут применять следующую проверку для цикла
while:
while (‘string)
Когда string указывает на нулевой символ, *string имеет значение 0, что прекращает цикл. Такой подход определенно требует меньшего набора с клавиатуры, чем предыдущая версия. Тем, кто не знаком с практикой программирования на С, этот прием менее очевиден. Однако данный подход получил широкое распространение, и ожидается, что программисты на С должны его знать.
На заметку!
Почему в листинге 11.14 в качестве формального аргумента используется const char * string, а не const char string[] ? Формально они эквивалентны, поэтому будет работать любая форма. Одна из причин применения формы записи с квадратными скобками — желание напомнить пользователю, что данная функция обрабатывает массив. Тем не менее, в случае строк фактическим аргументом может быть имя массива, строка в кавычках или переменная, которая была объявлена с типом char *. Использование const char * string напоминает о том, что фактическим аргументом не обязательно должен быть массив.
Предположим, что вам необходима функция, похожая на puts(), которая также сообщает, сколько символов было выведено. Как демонстрируется в листинге 11.15, добавить такую возможность легко.
444 Глава 11
Листинг 11.15. Функция put2()

Следующий вызов функции выводит строку пицца: put1("пицца");
Показанный ниже вызов возвращает также количество символов, присвоенных переменной num (в данном случае 5):
num = put2("пицца");
В листинге 11.16 представлен драйвер, предназначенный для тестирования putl() и put2() , а также вложенных вызовов этих функций.
Листинг 11.16. Программа put put.с

Символьные строки и строковые функции 445
Мы применяем printf() для вывода значения функции put2(), но в процессе выяснения этого значения эта функция сначала должна быть выполнена, что приводит к выводу строки. Ниже показан вывод:
Если бы у меня было столько денег, сколько я мог бы потратить, то я никогда не заботился бы о починке старых башмаков.
Получилось 55 символов.
Строковые функции
Библиотека С предоставляет несколько функций обработки строк; в ANSI С прототипы этих функций содержатся в заголовочном файле string.h. Мы ознакомимся с наиболее полезными и распространенными функциями: strlen(), strcat(), strncat(), strcmp(), strncmp(), strcpy() и strncpy(). Мы также исследуем функцию sprintf(), которая поддерживается заголовочным файлом stdio.h. Полный перечень семейства функций string.h приведен в разделе V приложения Б.
функция strlen()
Как вы уже знаете, функция strlen() находит длину строки. Она используется в следующем примере функции, которая сокращает длинные строки:
void fit(char *string, unsigned int size)
{
if (strlen (string) > size)
string [size] = ‘\0’;
}
Функция изменяет строку, поэтому в ее заголовке при объявлении формального параметра string модификатор const не указан.
Функцию fit() можно протестировать с помощью программы, приведенной в листинге 11.17. Обратите внимание, что в коде применяется конкатенация строковых литералов С.
Листинг 11.17. Программа test fit.с

L
446 глава 11
Вывод этой программы имеет следующий вид:
Все должно быть максимально простым, но не более.
Все должно быть максимально простым
Рассмотрим еще несколько строк, но не более.
Функция fit() помещает символ ‘\0’ в 36-й элемент массива вместо символа запятой. Она останавливается при обнаружении первого нулевого символа, игнорируя оставшуюся часть массива. Тем не менее, остальная часть массива никуда не делась, как показывает следующий вызов функции:
puts (mesg + 36);
Выражение mesg +36 дает адрес элемента mesq [36], которым является символ пробела. Таким образом, puts() отображает этот символ и продолжает работу до тех пор, пока не столкнется с исходным нулевым символом. На рис. 11.4 показано, что происходит в этой программе (на примере более короткой строки).
Читать дальше