Между прочим, какое значение возвращает strcmp( ), если строки не одинаковы? Вот пример:
/* возвраты функции strcmp */
#include
main( )
{
printf(" %d \n" , strcmp( "A" , " A" ));
printf(" %d \n" , strcmp( "A" , " B" ));
printf(" %d \n" , strcmp( "B" , " A" ));
printf(" %d \n" , strcmp( "C" , "A" ));
printf(" %d \n" , strcmp(" apples", " apple"));
}
В результате получаем
0 -1
1
2 115
Как мы и предполагали, сравнение "А"с самим собой возвращает 0. Сравнение "А"с "В"дает -1, а "В"с "А"дает 1. Это наводит на мысль, что strcmp( )возвращает отрицательное число, если первая строка предшествует второй в алфавитном порядке, или положительное число, если порядок иной. Кроме того, сравнение "С"с "А"дает 2 вместо 1. Картина проясняется: функция возвращает разницу между двумя символами в коде ASCII. В более общем смысле strcmp()передвигается вдоль строк до тех пор, пока не находит первую пару не совпадающих символов; затем она возвращает разницу в кодах ASCII. Например, в самом последнем примере "apples"и "apple"совпадают, кроме последнего символа 's', в первой строке. Он сопоставляется с шестым символом в "apple", который является нуль-символом (0 в ASCII).
Возвращается значение
's' - '\0' = 115 - 0 = 115,
где 115 является кодом буквы 's'в ASCII.
Обычно вам не нужно точно знать возвращаемое значение. Чаще всего вы только хотите знать, нуль это или нет, т. е. было ли совпадение. Или, может быть, вы пытаетесь отсортировать строки в алфавитном порядке и хотите узнать, в каком случае сравнение дает положительный, отрицательный или нулевой результат.
Можно использовать эту функцию, чтобы проверить, остановится ли программа, читая вводимую информацию:
/* Начало какой-то программы */
#include &stdio.h&
#define SIZE 81
#define LIM 100
#define STOP " " /* нулевая строка */
main( )
{
static char input[LIM][SIZE];
int ct = 0;
while(gets(input[ct]) != NUL && strcmp(input[ct].STOP) !=0
&& ct++ < LIM)
...
}
Программа прекращает чтение вводимой строки, если встречает символ EOF[в этом случае gets( )возвращает NULL], или если вы нажимаете клавишу [ ввод] в начале строки (т.e. введете пустую строку), или если вы достигли предела LIM. Чтение пустой строки дает пользователю простой способ прекращения ввода.
Давайте перейдем к последней из обсуждаемых нами функций, работающих со строками.
Мы уже говорили, что если pts1и pts2являются указателями строк, то выражение
pts2 = ptsl;
копирует только адрес строки, а не саму строку. Предположим, что вы все же хотите скопировать строку. В этом случае можно использовать функцию strcpy( ). Она работает примерно так:
/* демонстрация strcpy( ) */
#include
#define WORDS "Проверьте, пожалуйста, вашу последнюю чапись."
main( ) {
static char *orig = WORDS;
static char copy [40];
puts(orig);
puts(copy);
strcpy(copy, orig);
puts(orig);
puts(copy);
}
Вот результат:
Проверьте, пожалуйста, вашу последнюю запись.
Проперьтe, пожалуйста, пашу последнюю запись.
Проверьте. пожалуйста, пашу последнюю запись.
Очевидно, что строка, на которую указывает второй аргумент ( orig) функции strcpy( ), скопирована в массив, на который указывает первый аргумент ( copy). Порядок аргументов функции такой же, как в операторе присваивания: строка, получающая значение, стоит слева. (Пустая строка является результатом печати массива copyдо копирования, и она говорит о том, что статические массивы .инициализируются нулями, т. е. нуль-символами в символьном виде.)
Нужно обеспечить, чтобы размер массива, принимающего строку, был достаточен для ее размещения. Поэтому мы используем описание
static char copy [40];
а не
static char *copy; /* не выделяет память для строки */
Короче говоря, strcpy()требует два указателя строк в качестве аргументов. Второй указатель, ссылающийся на исходную строку, может быть объявленным указателем, именем массива или строковой константой. А первый указатель, ссылающийся на копию, должен ссылаться на массив или часть массива, имеющего размер, достаточный для размещения строки.
Теперь, когда мы описали несколько функций, работающих со строками, рассмотрим целую программу, работающую со строками.
Читать дальше