Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
09.04.2015
Размер:
232.96 Кб
Скачать

Void strcpy ( char *s, char *t)

{ int i =0;

while ( (s[i] = [i])) != ‘\0’)

i++;

}

В этой функции формальные параметры s иtуказатели, но обращение к ним происходит как к массивам, что допустимо. Однако если мы вспомним, чтоs иt прежде всего указатели, то эту функцию можно написать более компактно:

Void strcpy ( char *s, char *t)

{ while ( (*s++ = *t++) != ‘\0’);

}

Согласитесь, что последний вариант текста лучше использует возможности языка Си и более эффективен (нет лишних операторов и переменных) по сравнению с первым вариантом.

А теперь рассмотрим функцию сравнения строк. Лексикографическое сравнение строкозначает следующее.Строка s1 строки s2 (знак ‘’ читается как “лексикографически больше”), если при сравнении их символов слева направо первый символ из s1, не равный символу из s2, имеет большее значение его кода, по сравнению с соответствующим символом из s2. В противном случае, s1 s2 (знак ‘’ читается как “лексикографически меньше). Если же все символы строк одинаковы, то строки считаются равными.Сравним таким образом два слова “СТОЛ” и “СТУЛ”. Очевидно, результат в данном случае зависит от сравнения символов ‘О’и ‘У’. Код символа ‘У’ больше кода символа ‘О’, следовательно, “СТОЛ”“СТУЛ”. Ну а если слова разной длины? Как сравнить “СТУЛ” и “СТУЛЬЯ”? В этом случае сравнивается “СТУЛ\0\0”и “СТУЛЬЯ”. Тогда понятно, что “СТУЛЬЯ”“СТУЛ\0\0”.

Ниже приведен текст библиотечной функции сравнения строк – strcmp:

Int strcmp ( char * s, char * t)

{

for ( ; *s == *t; s++, t++)

if ( *s ==’\0’)

return 0;

return *s - *t;

}

Эта функция выдает целое отрицательное число при s < t, нуль при s == t, целое положительное число приs > t. Число, отличное от нуля означает разницу кодов первых, неравных символов (return *s - *t;). Обратите внимание в этом тексте на организацию циклаfor ( ; *s == *t; s++, t++). В этом цикле нет действий перед началом цикла, тело цикла выполняется, пока очередные сравниваемые символы равны (*s == *t). Выход из цикла осуществляется как только очередной символ изs станет равным нуль-символу (*s ==’\0’).

Для определения длины строки имеется стандартная функция, прототип которой имеет вид:

Unsigned strlen (const char *str );

Эта функция определяет длину строки str. Служебное словоconst означает, что соответствующийstr фактический параметр не должен меняться при выполнении функции. Рассмотрим пример использования этих функций:

# include <stdio.h>

# include <conio.h>

# include <string.h>

# define n 80

Void strcpy (char *s,char *t);

Void main ()

{ char text1[n],text2[n];

int i;

clrscr();

puts( "Введите текст 1:\n");

gets(text1);

puts("Вы ввели текст 1: ");

puts(text1);

strcpy (text2,text1);

puts("Текст2: ");

puts(text2);

i = strcmp(text1,text2);

printf("result=%d\n",i);

puts( "Введите текст 2:\n");

gets(text2);

i = strcmp(text1,text2);

printf("result=%d\n",i);

i = strlen(text2);

printf("длина строки text2=%d\n",i);

printf("Размер text2=%d",sizeof(text2));

getch();

}

В программу вставлен препроцессорный оператор # include <string.h>, который включает в нее стандартные функции обработки строк. При выполнении этой программы мы получим следующий результат на экране, если будем по запросу вводить сначала слов СТУЛ, затем слово СТОЛ:

Введите текст 1 СТУЛ Вы ввели текст 1: СТУЛ Текст 2: СТУЛ result = 0 Введите текст 2: СТОЛ result = 5 Длина строки text2=4 Размер text2 = 80

Результат после сообщения Текст 2:

СТУЛ result = 0

означает, что копирование выполнено правильно и слова одинаковы. Затем после ввода слова СТОЛ результат сравнения (result = 5)означает, чтоСТУЛ > СТОЛ и код буквы ‘У’ больше кода буквы ‘О’ на 5 единиц. Последняя информация сообщает, что длина строкиtext2 = 4 (в слове СТУЛ 4 буквы, но размер переменнойtext2, которая хранит это слово, равен 80). Таблица стандартных функций для работы со строками приведена в файле приложений.

А теперь рассмотрим программу решения задачи, которая будет вам полезна в дальнейшем изучении нашей дисциплины. Постановка задачи.

Дантекст. Слова в тексте разделяются символами пробела (‘ ’) или табулирования (‘\t’). Текст заканчивается символом начала новой строки (\n) или символом окончания строки (‘\0’), а его длина – не более 80 символов.

Требуется: составить программу формирования динамического массива, каждый элемент которого является строкой Си, соответствующей очередному слову.

Программа решения этой задачи представлена ниже:

# include <stdio.h>

# include <conio.h>

# include <iostream.h>

# define n 81

// прототип функции формирования строки, соответствующей // очередному слову

Соседние файлы в папке attachments_05-09-2012_18-55-54