Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015

Тут можно читать онлайн Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - бесплатно полную версию книги (целиком) без сокращений. Жанр: Прочая старинная литература, издательство Вильямс, год 0101. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.

Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - описание и краткое содержание, автор Стивен Прата, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать книгу онлайн бесплатно, автор Стивен Прата
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Символьные строки и строковые функции 461

символов, оставшаяся часть целевой строки заполняется нулевыми символами. Если исходная строка содержит n или больше символов, нулевой символ не копируется. Возвращаемым значением является s1.

• char *strcat(char * restrict s1, const char * restrict s2);

Строка, указанная s2, копируется в конец строки, на которую указывает s1. Первый символ строки s2 копируется поверх нулевого символа строки s1. Возвращаемым значением является s1.

• char *strncat(char * restrict s1, const char * restrict s2, size_t n);

К строке s1 добавляется не более n символов строки s2, причем первый символ строки s2 копируется поверх нулевого символа строки s1. Нулевой символ и любые другие символы, которые за ним следуют в строке s2, не копируются, а к результату добавляется нулевой символ. Возвращаемым значением является s1.

• int strcmp (const char * s1, const char * s2);

Эта функция возвращает положительное значение, если в последовательности сопоставления машины строка s1 следует за строкой s2, значение 0, если строки идентичны, и отрицательное значение, если в последовательности сопоставления первая строка предшествует второй.

• int strncmp (const char * s1, const char * s2, size_t n);

Эта функция работает подобно strcmp(), за исключением того, что процедура сравнения останавливается после просмотра n символов либо при появлении первого нулевого символа, в зависимости от того, что произойдет раньше.

• char *strchr (const char * s, int c);

Эта функция возвращает указатель на первую ячейку строки s, в которой содержится символ с. (Завершающий нулевой символ является частью строки, так что его тоже можно искать.) Если символ не найден, функция возвращает нулевой указатель.

• char *strpbrk (const char * s1, const char * s2);

Эта функция возвращает указатель на первую ячейку строки s1, в которой содержится любой символ, найденный в строке s2. Эта функция возвращает нулевой указатель, если ни одного символа не найдено.

• char *strrchr (const char * s, int c);

Эта функция возвращает указатель на последнее вхождение символа с в строке s. (Завершающий нулевой символ является частью строки, так что его тоже можно искать.) Если символ не найден, функция возвращает нулевой указатель.

• char *strstr (const char * s1, const char * s2);

Эта функция возвращает указатель на первое вхождение строки s2 внутри строки s1. Если строка не найдена, функция возвращает нулевой указатель.

• size_t strlen (const char * s);

Эта функция возвращает количество символов, не включая нулевой, находящихся в строке s.

Обратите внимание, что во всех прототипах используется ключевое слово const, чтобы отразить, какие строки нс изменяются функцией. Например, взгляните на следующий прототип:

char *strcpy(char * restrict s1, const char * restrict s2);

462 глава 11

Это означает, что s2 указывает на строку, которая не может быть изменена, во всяком случае, функцией strcpy(), но s1 указывает на строку, изменять которую разрешено. В этом есть смысл, т.к. s1 — целевая строка, подвергающаяся изменениям, а s2 — исходная строка, которая должна оставаться неизменной.

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

Тип size t, как отмечалось в главе 5 — это любой тип, возвращаемый операцией sizeof. В языке С заявлено, что операция sizeof возвращает целочисленный тип, но не задано, какой именно; таким образом, в одной системе size t может быть unsigned int, а в другой — unsigned long. В заголовочном файле string.h тип имеется определение size_t для конкретной системы либо указывается ссылка на другой заголовочный файл, содержащий необходимое определение.

Как уже упоминалось, в разделе V приложения Б перечислены все функции в семействе string.h. Многие реализации предоставляют дополнительные функции помимо требуемых стандартом ANSI. Чтобы посмотреть, что доступно, обращайтесь в документацию по своей реализации.

Рассмотрим простой случай использования одной из таких функций. Ранее было показано, что функция fgets() при чтении строки ввода сохраняет символ новой строки в целевой строке. В нашей функции s_gets() для обнаружения символа новой строки применялся цикл while, но вместо него можно использовать strchr(). Сначала найдите с помощью функции strchr() символ новой строки, если он есть. Когда он обнаруживается, strchr() возвращает адрес символа новой строки, и затем по этому адресу можно поместить нулевой символ:

fgets(line, 80, stdin);

find = strchr(line, '\n'); // поиск символа новой строки

if (find) // если адрес не является NULL,

*find = '\0'; // поместить туда нулевой символ

Если strchr() не удается найти символ новой строки, функция fgets() достигнет лимита на размер еще до конца строки. Для обработки такой ситуации к оператору if можно добавить конструкцию else, как это делалось в s_gets().

Давайте рассмотрим завершенную программу, которая обрабатывает строки.

Пример обработки строк: сортировка строк

Давайте решим практическую задачу сортировки строк в алфавитном порядке. Эта задача возникает при подготовке списков фамилий, во время индексации и во многих других ситуациях. Одним из основных инструментов в такой программе является функция strcmp(), поскольку она может применяться для выяснения порядка следования двух строк. Генеральный план предполагает чтение массива строк, их сортировку и вывод. Ранее мы представляли схему для чтения строк, и с этого мы начнем настоящую программу. С выводом строк никаких проблем не связано. Мы будет использовать один из стандартных алгоритмов сортировки, который объясним позже. Кроме того, мы применим также несколько необычный прием; посмотрите, сможете ли вы самостоятельно обнаружить его. Профамма показана в листинге 11.29.

Листинг 11.29. Программа sort str. с

Символьные строки и строковые функции 463 464 глава 11 Для тестирования - фото 362

Символьные строки и строковые функции 463

464 глава 11 Для тестирования программы из листинга 1129 мы ввели отрывок из - фото 363

464 глава 11

Для тестирования программы из листинга 11.29 мы ввели отрывок из поэмы А. С. Пушкина “Руслан и Людмила”:

Введите до 20 строк, и они будут отсортированы.

Чтобы остановить ввод, нажмите клавишу Enter в начале строки.

У лукоморья дуб зеленый;

Златая цепь на дубе том:

И днем и ночью кот ученый Все ходит по цепи кругом;

Отсортированный список:

Все ходит по цепи кругом;

Златая цепь на дубе том:

И днем и ночью кот ученый У лукоморья дуб зеленый;

Похоже, упорядочение строк по алфавиту сказалось на стихотворении довольно забавным образом.

Сортировка указателей вместо строк

Сложная часть этой программы связана с тем, что вместо самих строк переупорядочиваются указателина эти строки. Давайте посмотрим, что это означает. Первоначально элемент ptrst [0] установлен в input [0] и т.д. В результате указатель ptrst [1] ссылается на первый символ массива input [i]. Каждый элемент input [i] представляет собой массив из 81 элемента, а каждый элемент ptrst [i] — отдельную переменную. Процедура сортировки переупорядочивает ptrst, оставляя input незатронутым. Если, например, в алфавитном порядке input [1] находится перед input [0], то программа переключит указатели в ptrst, из-за чего ptrst [0] будет ссылаться на начало input [1], a ptrst [1] — на начало input [0]. Это намного проще, чем использование функции strcpy() для обмена содержимым двух строк в input. На рис. 11.6 представлена еще одна точка зрения на этот процесс. Данный процесс также обладает тем преимуществом, что сохраняет первоначальный порядок в массиве input.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стивен Прата читать все книги автора по порядку

Стивен Прата - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Язык программирования C. Лекции и упражнения (6-е изд.) 2015 отзывы


Отзывы читателей о книге Язык программирования C. Лекции и упражнения (6-е изд.) 2015, автор: Стивен Прата. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x