Главная
Регистрация
Вход
Суббота
23.11.2024
06:06
Приветствую Вас, Гость | RSS

Меню сайта

Друзья сайта

Категории раздела
1. Основы работы в среде C++ Builder.Основы языка Си++ [9]
2. Операторы ветвления и операторы передачи управления [4]
3. Операторы цикла и операторы передачи управления [5]
4. Одномерные массивы [3]
5. Многомерные массивы [3]
6. Указатели.Динамическое распределение памяти [6]
7. Отладка программы [3]
8. Функции [8]
9. Строки [5]
10. Функция Main [2]
11. Типы данных,определяемые пользователем [5]
12. Потоки ввода/вывода [7]
13. Основы объектно-ориентированного программирования [5]
Приложения [11]

Форма входа

Наш опрос
Оказался ли Вам полезным наш сайт?
Всего ответов: 464

Пользователи

Онлайн всего: 18
Гостей: 18
Пользователей: 0

 Каталог статей 
Главная » Статьи » Лекции по C++ » 9. Строки

PDA-версия страницы

3. Операции со строками. Часть 2.

Преобразование строк

Элементы символьных строк могут быть преобразованы из одного регистра в другой. Для этого используются стандартные функции _strlwr() и _strupr(). Следует отметить, что в некоторых версиях компиляторов имена данных функций могут следовать без ведущего символа подчеркивания.
Функция _strlwr () принимает в качестве параметра указатель на строку символов, преобразует эту строку к нижнему регистру (строчные символы) и возвращает указатель на полученную строку. Данная функция имеет следующий прототип:

char* _strlwr(char*  str)

Следующий фрагмент показывает применение функции _strlwr():

char str[]   =   "ABRACADABRA";
_strlwr(str);


После вызова функции строка str будет преобразована в "abracadabra".
Функция _strupr () объявлена следующим образом:

char* _strupr (char*  str)

Данная функция преобразует строку символов, на которую указывает str, в прописные буквы (к верхнему регистру). В результате работы функции возвращается указатель на полученную строку.
Следующий пример переводит символы заданной строки в верхний регистр:

char str[]="pacific ocean";
_strupr(str);
cout << str;


В результате будет выведено: PACIFIC  OCEAN
Приведенные выше функции преобразования строк, работая с указателями, преобразуют исходную строку, которая не может быть восстановлена, поэтому, если в дальнейшем коде программы потребуется воспользоваться оригиналом символьной строки, перед использованием функций _strlwr() и strupr () необходимо сделать копию строки.
На практике довольно широко используются функции проверки принадлежности символов какому-либо диапазону, такие как isalnum(), isalpha(), isascii(), isdigit() и т.д. (см. табл. 8.2), объявленные в заголовочном файле ctype.h. Ниже рассматривается пример использования этого вида функций.

char str[4];
do
{
cout << RUS("Сколько тебе лет ?\n");
cout << RUS("Введите 3 символа и нажмите Enter\n");
cin.getline(str,4);
if (isalpha(str[0]))
{
cout << RUS("Первый символ буква,");
cout << RUS("Введите заново\n");
continue;
}
if (iscntrl(str[0]))
{
cout << RUS("Первый символ управляющий,");
cout << RUS("Введите заново\n");
continue;
}
if (ispunct(str[0]) )
{
cout << RUS("Первый символ знак пунктуации,");
cout << RUS("Введите заново\n");
continue ;
}
for(int i=0; i<strlen(str);i++)
{
if ( ! isdigit (str [i] ) ) continue ;
else
{cout << RUS("Ваш возраст ") << str; goto end;}
}
}
while(true);
end:


Здесь пользователю предлагается ввести свой возраст. Функция cin.getline () помещает в строку str введенную последовательность (до трех) символов, после чего следует проверка первого введенного элемента массива на принадлежность к буквенной, управляющей последовательностей или символам пунктуации. Если результат соответствующей проверки положительный, пользователю предлагается ввести данные повторно. В противном случае все введенные элементы строки проверяются на принадлежность к цифровому набору данных. Если хотя бы один из символов не удовлетворяет проверяемому условию, цикл ввода повторяется сначала. После корректного ввода данных на экран выводится сообщение о возрасте пользователя.

Обращение строк

Функция обращения строки strrev() меняет порядок следования символов на обратный (реверс строки). Данная функция имеет прототип:

char*  strrev(char*  str)

Следующий пример демонстрирует работу функции strrev ().

char str [6] ;
strcpy(str, RUS("Привет"));
cout << strrev(str);

В результате на экране будет выведена строка "тевирП". Эта функция изменяет строку-оригинал.

Поиск символов

Одна из часто встречаемых задач при работе со строками - поиск отдельного символа или даже группы символов. Библиотека string.h предлагает следующий набор стандартных функций.
Функция нахождения символа в строке strсhr () имеет следующий прототип:

char*  strchr(const char*  string,   int c)

Данная функция производит поиск символа с в строке string и в случае успешного поиска возвращает указатель на место первого вхождения символа в строку. Если указанный символ не найден, функция возвращает NULL. Поиск символа осуществляется с начала строки.
Ниже рассматривается фрагмент, осуществляющий поиск заданного символа в строке.

char str[6] ;
strcpy(str, "Привет");
char* pStr;
pStr = strchr(str,'и');
cout << RUS(pStr);


В результате работы программы указатель pStr будет указывать на подстроку "ивет", т.е. хранить адрес символа  'и'.
Функция strrchr () осуществляет поиск заданного символа с конца строки. Она имеет следующий синтаксис:

char*  strrchr(const char*  string,   int c)

Данная функция возвращает указатель на последний, совпавший с заданным  с, символ в строке string. Если символ не найден, возвращается значение NULL.
Функция strspn () проводит сравнение символов одной строки с символами другой и возвращает позицию (начиная с нуля), в которой строки перестают совпадать. Данная функция имеет следующий прототип:

size_t strspn(const char*   string, const char*  group)

Функция проверяет каждый символ строки string на соответствие каждому из символов строки group. В результате работы функции возвращается число совпавших символов.
Следующий пример демонстрирует использование данной функции:

char  str[]   =  "Загрузка параметров БД";
char  substr[]   =  "Загрузка параметррррр";
int index=0;
index = strspn(str, substr);
cout << index;


На экран будет выведено число 17, так как символы строки str и подстроки substr совпадают вплоть до 17-й позиции. Приведенная функция различает регистр символов.
Функция strcspn () имеет синтаксис:

size_t  strcpn(const char*   strl, const char*  str2)

Эта функция сопоставляет символы строки strl и str2 и возвращает длину строки strl, не входящей в str2. Таким образом, можно определить, в какой позиции происходит пересечение двух символьных массивов:

char str[] = "abcdefghijk";
int index;
index = strcspn(str, "elf");


Переменная index получит значение 4, так как в этой позиции строки имеют первый общий элемент.
Функция strpbrk () объявлена следующим образом:

char*   strpbrk(const char*   strl, const char*   str2)


Эта функция отыскивает место вхождения в строку strl любого из символов строки str2. Если символы найдены, возвращается место первого вхождения любого символа из str2 в строку strl. В противном случае функция возвращает NULL.
Ниже иллюстрируется использование функции strpbrk ():

char strl[]="abcdefghijk";
char str2[] = "ecb";
char* ptr;
ptr=strpbrk(strl, str2) ;
cout << ptr << ' \n' ;


В результате будет выведена подстрока "bcdefghijk", так как символ 'b' из строки str2 встречается в строке strl раньше других.

Поиск подстрок

При необходимости поиска в одной строке последовательности символов, заданной в другом символьном массиве (подстроке, лексеме), стандартная библиотека string.h предлагает воспользоваться одной из следующих функций.
Функция strstr () описана следующим образом:

char*  strstr(const char*  str, const char*   substr)

Данная функция осуществляет сканирование строки str и находит место первого вхождения подстроки substr в строку str. В случае успешного поиска функция strstr возвращает указатель на первый символ строки str, начиная с которого следует точное совпадение части str обязательно со всей лексемой substr. Если подстрока substr не найдена в str, возвращается NULL.
Следующий пример показывает использование функции strstr ().

char  strl[]="Производится поиск элемента";
char str2[]   =  "поиск";
char*  ptr;
ptr=strstr(strl,   str2);
cout << RUS(ptr);


На экран будет выведено "поиск элемента", так как подстрока, содержащаяся в str2, находится внутри строки strl и функция strstr () установит указатель ptr на соответствующий элемент символьного массива strl.
Чтобы найти место последнего вхождения подстроки в строку, можно воспользоваться следующим приемом: обе строки реверсируются с помощью функции strrev(), а затем полученный результат анализируется в функции strstr ().
Функция strtok () имеет синтаксис:

char*  strtok(char*  str,   const char* delim)

Эта функция выполняет поиск в строке str подстроки, обрамленной с обеих сторон любым символом-разделителем из строки delim. В случае успешного поиска данная функция обрезает строку str, помещая символ ' \0' в месте, где заканчивается найденная лексема. Таким образом, при повторном поиске лексемы в указанной строке str первым параметром следует указывать NULL. Так как strtok () модифицирует строку-оригинал, рекомендуется предварительно сохранять копию последней. Приведенный ниже пример иллюстрирует вышесказанное.
Предположим, необходимо разбить, имеющееся в строковом массиве предложение, по словам и вывести каждое из них на экран.

char str []="Язык программирования C++";
char *Delimiters = " .!?,;:\"'/0123456789@#$%^&*()<>{}[]~+-=";
char *ptr;
ptr = strtok(str, Delimiters);
if (ptr) {cout << RUS(ptr);cout<<"\n";}
while(ptr)
{
ptr = strtok(NULL, Delimiters);
if (ptr) {cout << RUS(ptr);cout<<"\n";}
}


В данной программе объявляется подлежащая анализу строка str, подстрока, содержащая набор разделителей Delimiters и указатель на символьный тип данных ptr. Вызов функции strtok (str, Delimiters) сканирует строку str и как только в ней встретится любой символ, входящий в подстроку Delimiters (в данном случае это символ пробела), указатель ptr станет ссылаться на начало исходной строки до найденного символа. То есть ptr будет содержать:
*ptr = "Язык"
Благодаря тому, что функция strtok () помещает в найденном месте нуль-терминатор '\0', исходная строка модифицируется. Таким образом, массив символов str примет значение:
"программирования C++"
Осуществив проверку указателя ptr на существование в операторе if (ptr) , найденное слово выводится на экран. Далее в цикле с помощью функции strtok () находится последний нуль-терминатор строки str:

ptr = strtok (NULL, Delimiters);

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

Функции преобразования типа

Функции преобразования данных довольно часто используются, как следует из названия, для преобразования одного типа данных в другой тип. В приведенной ниже табл. 8.3 перечислены основные функции, их прототипы подключаются в заголовочном файле stdlib. h.

Таблица 8.3. Преобразование данных

Наименование

Краткое описание

atof

преобразует строку символов в число с плавающей точкой

atoi

преобразует строку символов в строку типа int

atol

преобразует строку символов в число типа long

ecvt

преобразует число с плавающей точкой типа double в строку символов; десятичная точка и знак числа не включаются в полученную строку; позиция точки и знак числа возвращаются отдельно

fcvt

идентично ecvt, но округляет полученное значение до заданного числа цифр

gcvt

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

itoa

преобразует число типа int в строку символов

ltoa

преобразует число типа long в строку символов

strtod

преобразует строку символов в число с плавающей точкой типа double

strtol

преобразует строку символов в число типа long

strtoul

преобразует строку символов в число типа unsigned long

ultoa

преобразует число типа unsigned long в строку символов


Чаще всего данные функции используются для преобразования чисел, введенных в виде символьных строк, в числовое представление, для выполне-ния определенных арифметических операций над ними и обратное преобразование в строку символов. Рассмотрим самые широко используемые из них.
Функция atoi (), синтаксис которой

int atoi(const char* ptr)

преобразует ASCIIZ-строку символов, на которую указывает ptr, в число типа int. Если в строке встречается символ, который не может быть преобразован, данная функция возвращает 0. В случае если преобразуемое число превышает диапазон представления типа int, возвращается только два младших байта числа.
В отличие от нее, функция atol () преобразует заданное строковое число в тип long. Эта функция имеет аналогичный синтаксис:
int atol(const char* ptr)
Если преобразуемое число превышает диапазон значений типа long, функция возвратит непредсказуемое значение.
Рассмотрим пример преобразования строки цифровых символов в целое и длинное целое.

char str[]="70000000";
long i = atol(str);
cout << i << '\n';


Функция atof (), определенная как
double atof(const char* ptr)
выполняет преобразование ASCIIZ-строки в число с плавающей точкой типа double. Строка символов должна быть представлена с учетом формата:

[пробелы] [знак] [цифры] [.] [цифры] [е|E[знак]цифры] ,

где
[пробелы] - последовательность пробелов или табуляторов; [знак] - символ ' + ' или '-'; [цифры] - десятичные цифры; [е | Е]  - символ показателя степени.
Преобразование символов прекращается, как только найден первый не-конвертируемый символ или достигнут конец строки.
Функции обратного преобразования itoa() и ltoa() производят конвертирование чисел типа int и long соответственно. Они имеют следующий синтаксис:

char *_ltoa(long num, char* str, int radix);
и
char* itoa(int num, char* str, int radix);
или
char* _itoa(int num, char *str, int radix);

Данные функции принимают в качестве аргумента число num и преобразуют его в строку str с учетом основания системы счисления, представленной в переменной radix. Следующий фрагмент программы преобразует целое число 98765 в строку, используя десятеричную систему счисления:

int numb = 98765;
char str[10];
itoa(numb, str, 10);
cout << numb << '\n' << str;


Функция strtod() преобразует строку символов в число с плавающей точкой. Ее синтаксис имеет следующий вид:

double strtod(const char *s, char **endptr);

Эта функция так же, как и функция atof (), преобразует строку, на кото-рую указывает s, в число типа double, с тем лишь отличием, что в случае пре-кращения конвертирования строки возвращает указатель на первый непреобразуемый символ. Это позволяет организовать в дальнейшем обработку оставшейся части строки.
Функция gcvt () имеет прототип:

char* gcvt(double val,   int ndec,   char *buf);

и осуществляет конвертирование числа val типа double в ASCIIZ-строку, помещая ее в буфер buf. Если число цифр, подлежащих преобразованию, больше целого числа, указанного в ndec, в преобразованном числе указываются символы знака и десятичной точки, при этом младшие разряды дробной части отбрасываются. В противном случае число преобразуется в экспоненциальную форму. Функция возвращает указатель на начало сформированной строки.
Следующий ниже пример демонстрирует использование функции gcvt () для преобразования чисел, имеющих различное представление в массивы цифровых символов.

char str[10];
double num;
// Значащих цифр:
int sig = 4;
// Обычное представление числа
num = 3.547;
gcvt(num, sig, str);
cout << str << '\n' ;
// Отрицательное число
num = -843.7105;
gcvt(num, sig, str);
cout << str << '\n';
// Экспоненциальное представление
num = 0.135e4;
gcvt(num, sig, str);
cout << str << '\n';

В результате будет выведено:
3.547
-843.7
1350

Другие функции


Большинство функций работы со строками содержится в библиотеке string.h. Основные функции работы с символьными массивами сведены в таблицу I I I.1 (Приложение I I I).
Категория: 9. Строки | Добавил: Admin (10.09.2011)
Просмотров: 37895 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Помочь сайту!
рублей WMR
WebMoney на кошелек R407507742179

Партнёры сайта

Закладки

Поиск по сайту

Copyright H-L-L.RU © 2024
Сделать бесплатный сайт с uCoz