Программирование >>  Структурное программирование 

1 ... 121 122 123 [ 124 ] 125 126 127 ... 342


Программа на рис. 5.32 сравнивает три сроки, используя функции stremp и strncmp. Функция stremp сравнивает символ за символом строку в своем первом аргументе со строкой в своем втором аргументом. Функция возвращает О, если строки равны, отрицательное значение, если первая строка меньше, чем вторая, и положительное значение, если первая строка больше, чем вторая. Функция strncmp эквивалентна stremp, за исключением того, что strncmp проводит сравнение только до указанного количества символов. Функция strncmp не сравнивает символы, следующие за нулевым символом в строке. Программа печатает целое значение, возвращаемое при каждом вызове функции.

Типичная ошибка программирования 5.19

Предположение, что stremp и strncmp возвращают 1, если их аргументы равны. При равенаве обе функции возвращают О (значение ложь в С++). Поэтому при проверке двух арок на равенаво результаты функции stremp или strncmp должны для определения равенава арок сравниваться с 0.

Чтобы понять, что означает, что одна строка больше или меньше , чем другая строка, рассмотрим процесс расстановки имен по алфавиту. Читатель, без сомнения, поставил бы Jones перед Smith , потому что в алфавите первая буква имени Jones стоит раньше первой буквы имени Smith . Но алфавит - это больше, чем просто список из 26 букв - он упорядочивает список символов. Каждая буква занимает внутри списка определенную позицию. Z - это больше, чем просто буква алфавита; Z - это двадцать шестая буква алфавита.

Использование stremp и strncmp ♦include <iostream.h> iinclude <iomanip.h> iinclude <string.h>

main () {

char *sl = Счастливого Нового Года ; char *s2 = Счастливого Нового Года ; char *s3 = Счастливого Праздника ;

cout si = si endl s2 = s2 << endl

s3 = s3 << endl endl stremp(si, s2)= setw{2) strcmp(sl, s2) endl strcmp(sl, s3) = setw{2) stremp(si, s3) endl stremp(s3, si) = setw{2) stremp(s3, si) << endl << endl ;

cout strncmp(si, s3, 12) = setw(2) strncmp{sl, s3, 12) endl strcmp(sl, s3, 13) = setw(2) << strncmp(si, s3, 13) << endl stremp(s3, si, 13) = setw(2) strncmp(s3, si, 13) endl; return 0;

Рис. 5.32. Использование stremp и strncmp (часть 1 из 2)



si = Счастливого Нового Года s2 = Счастливого Нового Года S3 = Счастливого Праздника

strcmp(si, s2) = О strcmp(si, s3) = -2 strcmp(s3, si) = 2

strncmp(si, s3, 12) = 0 strncmp(si, s3, 13) = -2 strncmp(s3, si, 13) = 2

Рис. 5.32. Использование strcmp и strncmp (часть 2 из 2)

Как компьютер узнает о порядке следования букв? Все символы представляются внутри компьютера как численные коды; когда компьютер сравнивает две строки, он на самом деле сравнивает численные коды символов в строке. (Замечание: коды символов упорядочены по алфавиту только для латинских букв, а к кириллице это, к сожалению, не относится.)

Замечание по мобильности 5.5

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

В попытке стандартизации представления символов большинство производителей компьютеров спроектировало свои машины так, чтобы использовать одну из двух популярных кодируюш;их схем - ASCII или EBCDIC. ASCII означает Американский стандартный код для информационного обмена ( American Standard Code for Information Interchange ), a EBCDIC означает Расширенный двоичный код закодированного десятичного обмена ( Extended Binary Coded Decimal Interchange Code ). Суш;ествуют и другие схемы кодирования, но эти две наиболее популярны.

ASCII и EBCDIC называются символьными кодами или символьными наборами. Манипуляции со строками и символами на самом деле подразумевают манипуляцию с соответствующими численными кодами, а не с самими символами. Это объясняет взаимозаменяемость символов и малых целых в C-I-+. Так как имеет смысл говорить, что один численный код больше, меньше или равен другому численному коду, стало возможным сопоставлять различные строки и символы друг с другом путем ссылки на коды символов. Приложение В содержит список символьных кодов ASCII.

Функция strtok используется для превращения строки в последовательность лексем. Лексема - это последовательность символов, отделенная символами разделителям (обычно пробелами или знаками пунктуации). Например, в строке текста каждое слово может рассматриваться как лексема, а пробелы, отделяющие слова друг от друга, можно рассматривать как разделители.

Для разбиения строки на лексемы требуется несколько вызовов функции strtok (при условии, что строка содержит больше одной лексемы). Первый вызов strtok содержит два аргумента: строку, которую нужно разбить на



366 Глава 5 -J-

лексемы, и строку, которая содержит символы, разделяющие лексемы (т.е. разделители). В программе на рис. 5.33 оператор

tokenPtr = strtok(string, );

присваивает tokenPtr указатель на первую лексему в string. Второй аргумент strtok, указывает, что лексемы в string разделяются пробелами. Функция strtok отыскивает первый символ в string, не являющийся разделителем (пробелом). Это начало первой лексемы. Затем функция находит следующий разделительный символ в строке и заменяет его нулевым символом (\0). Этим заканчивается текущая лексема. Функция strtok сохраняет указатель на следующий символ, стоящий в string за данной лексемой, и возвращает указатель на текущую лексему.

Использование strtok iinclude <iostream.h> tinclude <string.h>

main () {

char string[] = Это предложение содержит пять лексем ; char *tokenPtr;

cout << Строка, разбиваемая на лексемы: << endl << string endl endl Лексемы: endl;

tokenPtr = strtok(string, ); while (tokenPtr != NULL) { cout tokenPtr endl; tokenPtr = strtok(NULL, );

}

return 0;

Строка, разбиваемая на лексемы: Это предложение содержит пять лексем

Лексемы: Это

предложение содержит пять лексем

Рис. 5.33. Использование strtok

Последующие вызовы strtok для продолжения разбиения string на лексемы содержат в качестве первого аргумента NULL. Аргумент NULL указывает, что вызов strtok должен продолжать разбиение на лексемы, начиная с ячейки в string, сохраненной последним вызовом strtok. Если лексем при вызове strtok больше не оказалось, strtok возвращает NULL. Программа на рис. 5.33 использует strtok для разбиения на лексемы строки Это предложение содержит пять лексем . Каждая лексема печатается отдельно. Заметим, что strtok модифицирует входн5ао строку; поэтому, если строка после вызова strtok будет снова использоваться в программе, необходимо сделать копию строки.



1 ... 121 122 123 [ 124 ] 125 126 127 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.003
При копировании материалов приветствуются ссылки.
Яндекс.Метрика