Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования 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
Для тестирования программы из листинга 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.
Читать дальшеИнтервал:
Закладка: