На заметку!
Функция 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 и "к" друг от друга в первом элементе.
Строка, на которую указывает второй аргумент (temp), копируется в массив, указанный первым аргументом (qword[i]). Копия называется целью, а исходная строка- источником. Порядок аргументов легко запомнить, т.к. он совпадает с порядком в операторе присваивания (целевая строка находится слева):
char target[20]; int х;
х = 50; /* присваивание для чисел */
strcpy(target, "Это так!"); /* присваивание для строк */
Читать дальше