Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Какое значение возвращает strcmp(), если строки не совпадают? В листинге 11.22 показан пример.
Листинг 11.22. Программа compback.c
452 глава 11
Сравнение символа "А" с самим собой возвращает 0. Сравнение "А" и "В" возвращает -1, а обратное сравнение возвращает 1. Из этих результатов следует, что функция strcmp() возвращает отрицательное число, если первая строка в алфавитном порядке предшествует второй, и положительное число, если порядок следования строк противоположный. Таким образом, сравнение "С" с "А" дает 1. Другие системы могут возвратить 2, т.е. разность между значениями ASCII-кодов. Стандарт ANSI требует, чтобы функция strcmp() возвращала отрицательное число, когда первая строка в алфавитном порядке предшествует второй, 0, если строки совпадают, и положительное число, если первая строка в алфавитном порядке следует за второй. Однако точные числовые значения зависят от реализации. Например, ниже приведен вывод для другой реализации, в которой возвращается разность между значениями кодов символов:
Л что, если начальные символы строк идентичны? В общем случае функция strcmp() продвигается по строкам до тех пор, пока не найдет первую пару несовпадающих символов. После этого она возвращает соответствующий код. В самом последнем примере строки "apples" и "apple" совпадают вплоть до финального символа в первой строке. Этот символ сравнивается с шестым символом строки "apple", которым является нулевой символ, имеющий ASCII-код 0. Так как нулевой символ является первым в последовательности ASCII, символ s находится после него, функция возвращает положительное значение.
Последнее сравнение показывает, что strcmp() сравнивает все символы, а не только буквы, поэтому вместо утверждения, что сравнение производится в алфавит ном порядке, можно сказать, что strcmp() следует последовательности сопоставления машины. Это означает, что символы сравниваются согласно их числовым представлениям, которыми обычно являются значения ASCII-кодов. В кодировке ASCII коды прописных букв предшествуют кодам строчных букв. Таким образом, strcmp ("Z", "а") возвращает отрицательное число.
Чаще всего о точном возвращаемом значении можно не беспокоиться. Вполне достаточно знать, нулевое оно или нет, т.е. совпадают ли строки. Если требуется сортировать строки в алфавитном порядке, то нужно знать, каким является результат сравнения — положительным, отрицательным или нулевым.
На заметку!
Функция strcmp() предназначена для сравнения строк, а не символов. Следовательно, вы можете указывать такие аргументы, как "apples" и "А", но не символьные аргументы наподобие 'а' . Тем не менее, вспомните, что тип char является целочисленным, поэтому для сравнения символов можно применять операции отношений. Предположим, что word — это строка, хранящаяся в массиве элементов char, a ch — переменная типа char. Тогда показанные ниже операторы допустимы:
if (strcmp(word, "выход") == 0) // используйте strcmp() для строк
puts("Всего хорошего!");
if (ch == 'в') II используйте == для символов
puts("Всего хорошего!");
Однако не применяйте ch или 'в' в качестве аргументов для strcmp().
Символьные строки и строковые функции 453
В листинге 11.23 функция strcmp() используется для выяснения, когда программа должна остановить чтение ввода.
Листинг 11.23. Программа quit chk.c
Программа завершает чтение входных данных, когда встречает символ EOF (в этом случае s_gets() возвращает NULL), при вводе слова quit или по достижении предела, указанного в LLM.
Кстати, чтение входных данных иногда удобнее прекращать путем ввода пустой строки, т.е. нажатием клавиши или , не набирая ничего другого. Для этого оператор цикла while можно модифицировать так:
while (ct < LIM && s_gets(input[ct], SIZE) != NULL && input[ct][0] != '\0')
Здесь input [ct] представляет собой только что введенную строку, a input [ct] [0] — первый символ этой строки. Если пользователь вводит пустую строку, то функция s_gets() помещает в первый элемент нулевой символ, так что выражение
input[ct] [0] != '\0'
выполняет проверку на предмет пустой входной строки.
454 глава 11
Вариация stmcmpO
Функция strcmp() сравнивает строки до тех пор, пока не найдет пару соответствующих символов, которые отличаются друг от друга, и этот поиск может продолжаться вплоть до достижения конца одной из строк. Функция strncmp() сравнивает строки до тех пор, пока не обнаружит в них различия либо пока не сравнит количество символов в обеих строках, указанное в третьем аргументе. Например, если необходимо найти строки, начинающиеся с "астро", то поиск можно было бы ограничить первыми пятью символами. В листинге 11.24 показано, как это сделать.
Вот вывод, полученный из программы:
Найдено: астрономия Найдено: астрофизика Найдено: астролябия
Количество слов в списке, начинающихся с астро: 3
ФУНКЦИИ strcpy() И strncpy()
Ранее мы говорили, что если ptsl и pts2 — указатели на строки, то оператор
pts2 = ptsl;
копирует только адрес строки, но не саму строку. Тем не менее, предположим, что вы хотите скопировать строку. В таком случае можете воспользоваться функцией strcpy(). Код в листинге 11.25 предлагает пользователю ввести слова, начинающиеся с буквы к. Эта программа копирует ввод во временный массив, и, если первой буквой является к, программа использует функцию strcpy() для копирования этой строки из временного файла в место ее постоянного хранения. Функция strcpy() представляет собой строковый эквивалент оператора присваивания.
Ниже показаны результаты пробного запуска:
Введите 5 слов, которые начинаются с буквы к:
квазар
квота
кристалл
квалификация
больше нет
больше нет не начинается с буквы к!
456 глава 11
конкурс
Список принятых слов:
квазар
квота
кристалл
квалификация
конкурс
Обратите внимание, что счетчик i инкрементируется, только когда вводимое слово проходит проверку на наличие первой буквы к. Кроме того, в программе применяется проверка на основе символов:
if (temp[0] != 'к')
Условие выясняет, отличается ли первый символ в массиве temp от буквы к. Другая возможность связана с использованием проверки на основе строк:
if (strncmp(temp, "к", 1) != 0)
Условие определяет, отличаются ли строки temp и "к" друг от друга в первом элементе.
Читать дальшеИнтервал:
Закладка: