Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Функция printf()
Мы довольно подробно обсуждали функцию printf() в главе 4. Как и puts(), она принимает в качестве аргумента адрес строки. Функция printf() менее удобна в употреблении, чем puts(), но она более универсальна, т.к. способна форматировать различные типы данных.
Одно из отличий заключается в том, что функция printf() не выводит автоматически каждую строку в новой строке на экране. Вместо этого вы должны самостоятельно указывать, где должны начинаться новые строки. Таким образом,
printf("%s\n", string); приводит к тому же результату, что и
puts(string);
Как видите, первая форма длиннее. Она также требует большего времени на выполнение (правда, не настолько, чтобы это стало заметным). С другой стороны, printf() упрощает объединение нескольких строк в одной строке вывода. Например, следующий оператор объединяет в одну строку вывода слово Хорошо, имя пользователя и символьную строку, определенную с помощью #define:
printf("Хорошо, %s, %s\n", name, MSG);
возможность самостоятельного создания функций
При вводе и выводе вы не ограничены только функциями стандартной библиотеки С. Если они недоступны или по какой-то причине не нравятся, можете подготовить собственные версии на основе функций getchar() и putchar(). Предположим, что вам нужна функция, подобная puts() , которая не добавляет автоматически символ новой строки. В листинге 11.14 продемонстрирован один из способов создания такой функции.
Символьные строки и строковые функции 443
Листинг 11.14. Функция putl()
Указатель string на char изначально ссылается на первый элемент переданного аргумента. Поскольку эта функция не изменяет строку, применяется модификатор const. После того, как содержимое этого элемента выведено, указатель инкрементируется и указывает на следующий элемент. Это продолжается до тех пор, пока указатель не будет ссылаться на элемент, содержащий нулевой символ. Вспомните, что операция ++ имеет более высокий приоритет, чем *, так что вызов putchar (* str ing++) выводит значение, на которое указывает string, но инкрементирует сам указатель string, а не символ, на который он ссылается.
Функцию 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 показано, что происходит в этой программе (на примере более короткой строки).
Читать дальшеИнтервал:
Закладка: