Мегаобучалка Главная | О нас | Обратная связь


Основные функции обработки символьных типов



2019-08-13 266 Обсуждений (0)
Основные функции обработки символьных типов 0.00 из 5.00 0 оценок




 

В ранних версиях С++ строки рассматривались как символьные массивы и работа с ними основывалась на использовании этих массивов. Разработанная библиотека функций <string.h> содержит мощные средства для работы со строковыми массивами. Впоследствии была разработана стандартная библиотека шаблонов Standard Template Library (STL) , которая предоставляет еще более мощные средства работы со строками, объединенные в класс <string>. Этот класс включается как заголовочный файл , т.е.:

# include < string>   // без буквы h

 

Для обработки символьных типов данных библиотека функций <string.h> имеет большое количество встроенных функций, увеличивающих производительность труда программистов и сокращающих время на разработку программ. Эта библиотека содержит такие функции, как например:

 

¾ функции проверки символов;

¾ функции преобразования символов;

¾ функции проверки строк;

¾ функции манипулирования строками.

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

 

Рассмотрим прототипы, краткое описание действий и методику использования наиболее употребляемых функций:

                                                                                                      

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

 char strcpy (s, *st); ¾ копирует байты строки st в строку s, (включая "\0"; возвращает s), например:

 

                   char str [50];

                 strcpy (str, "Сегодня хорошая погода ");

 char *strdup (const char *str); ¾ копирует строку str  и возвращает

указательна строку – копию, например:

 

                          char *st1 = " Пришла весна ";

char *st2;

                  st2= strdup (st1); // Копируется st1 в st2

char * strnpy (char *st1,const char *st2, int n); ¾ копирует n символов из строки st2   в st1, строка st1 должна быть больше или равна st2, иначе возникнет ошибка,  например:

 

char st1[]= "Паскаль ";

char st2[] = "Привет из далека ";

strnpy (st1,st2,3);  // Теперь в st1 ¾ "Прикаль"

 

¾ Конкатенация слов

char *strcat (char *st1, const char *st2); ¾ объединяет st1  и st2  и возвращает st1,  например:

char string [100];

strcpy (string, "Borland ");

strcat (string, " C++5");  ,

в результате строка string = "Borland C++ 5"   ;

 

char *strncat (char *st1, const char * st2, int n); ¾ добавляет к строке st1 n символов строки st2 и возвращает в st1, например :

с har st1 [90] = "Привет " ;

char st2 [50] = " Саша и Маша ";

strncat (st1, st2, 4);

st1 ="Привет Саша ".

¾ Сравнение строк

int strcmp ( char *st1, char *st2); - сравнивает строки st1 и st2  и возвращает целую величину равную:

< 0 ¾ если    st1 < st2;

= 0 ¾ если st1 = st2;

> 0 ¾ если st1 > st2;       ,

например:

char st1[] = "Слово " ;

char st2 [] = "слово ";

int k;

k = strcmp (st1, st2); // k < 0;

int stricmp (const char *st1, const char *st2); ¾ выполняет сравнение строк не учитывая регистра символов; возвращает целую величину как и в предыдущем случае (см. функцию strcmp() ), например:

char st1[] = "Слово " ;

char st2 [] = "слово ";

int k;

k = stricmp (st1, st2); k=0;

int strncmp (char *st1, char *st2, int n); ¾ выполняет сравнение строк c заданным количеством символов n в st1 и st2 и возвращает целую величину:

< 0   ¾ если st1 < st2;

= 0 ¾ если st1 = st2;

> 0 ¾ если st1 > st2;

 

char *strnicmp (char *st1, char *st2, int n); ¾ выполняет сравнение строк c заданным количеством символов n в st1  и st2  , без учета регистра и возвращает целую величину как и в предыдущем случае.

 

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

char *strlwr (char *st);  ¾ преобразует символы строки st верхнего

регистра в символы нижнего регистра, другие символы не затрагиваются,

Например:

                char st [i] =" Привет Маша';

strlwr (st); // теперь st = "привет маша".

char *strupr (char *st); ¾ преобразует символы строки st нижнего регистра в символы верхнего регистра, другие символы не затрагиваются; 

char *strrev (char *st); ¾ записывает символы в строке st в обратном порядке (реверсирует строку), например:

char st [] =" Hello";

strrev (st); // теперь st = " olleH".

 

char *strchr (char *st , int c); ¾ определяет первое вхождение символа c в строку st; возвращает указатель на символ в строке st, который соответствует введенному образцу, например:

 

с har st [90] = " Borland C++ 5 "

char *spt;

spt = strchr (st , '+');

// Теперь указатель spt указывает на подстроку "++5" строки st.

char *strchr (char *st, int c); ¾ находит последнее вхождение символа c  в строку st;  eсли символ c в строке не обнаружен ¾ возвращает 0, иначе возвращает указатель на последний символ в строке st, который соответствует заданному образцу, например:

char st [80] = "Borland C++5";

char *spt;

spt = strrchr (st , '+');

// Теперь указатель spt указывает на подстроку "+5" строки st.

 

¾ Поиск подстроки в строке

 

strspn (const char *st1, const char *st2 ); ¾ возвращает количество символов от начала строки st1, совпадающих с символами строки st2, где бы они не находились в st2, например:

 

char st1 [] = "Borland C++5";

char st2 [] = " narlBod ";

int k;

k = strspn (st1, st2); // k=8

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

char *strstr (const char *st1,const char *st2); ¾ функция ищет в строке st1 первое вхождение st2 и возвращает указатель на первый символ, найденный в st1 из подстроки st2; если строка st2 не обнаружена в st1 - функция возвращает 0, например:

char st1 [] = "Привет друг, идем в кино " ;

char st2 [] = "друг ';

char*spt;

spt = strstr ( st1, st2);

Результат выполнения:

                         spt = " друг, идем в кино".

В случае необходимости определения последнего вхождения, надо вначале реверсировать строку с помощью функции strrew.

char *strtok ( char *st, const char *dlm); - разбивка строки на лексемы ( сегменты ), ограниченные символами включенными в состав параметра dlm. Этот параметр может содержать любое количество разных ограничителей ¾ признаков границ лексем; после выделения лексемы в строку st помещается символ '\0'.

Последующие вызовы функции strtok() должны быть. с первым аргументом NULL. Они будут возвращать указатель на другие , имеющиеся в st лексемы. Каждый раз после завершения выделения лексем в ее конце вместо разделительного символа помещается символ '\0'. После того, как в строке не останется ни одной лексемы, функция возвращает NULL . Для сохранения исходной строки ее надо записать в резервную переменную. Эту функцию удобно использовать для разбивки предложения на слова или любые другие сегменты. Рассмотрим пример программы с использованием strtok():

Пример 3.4 Ввести предложение разбить его на слова с выводом порядкового номера слова и подсчетом символов в каждом слове:

//P3_4.CPP ¾ применение функции strtok( ).

// определение порядкового номера слова в предложении и

// подсчет символов в каждом слове

 # include < string. h>

#include <iostream.h>

void main ()

{

char * tk, * spt =", .!";

char st[] = "Саша, пусть всегда будет солнце!";

cout << st << endl;

int i = 1;

tk = strtok (st, spt);

while (tk = NULL)

{

cout << I << " слово-" << tk << " содержит " <<

                         strlen(tk) << "символов " << endl;

tk = strtok (NULL,spt);

i++;

}

}

Процесс разбивки можно было бы записать и таким образом:

 

tk = strtok (st < spt);       // Первый вызов функции

While (tk)

if (( tk = strtok (), spt) != 0) cout <<. . .

 

Для удаления из строки подстроки или символа с заданной позиции в языке С++ нет специальной функции, однако можно написать свою, например:

 

                    void del (char *st, int k, int n);

{

for ( int i = k; i < strlen(st); i++)

st[ i] = st [ i + n ];

st [i] ='\0'; // Запись '\0'  в конец новой строки        

}   

где st ¾ исходная строка (указатель на неё);

n ¾ количество символов в удаляемой подстроке;

k ¾ позиция, с которой надо удалить подстроку.

Ниже приведен пример, иллюстрирующий реализацию этой программы

Пример 3.5 Составить программу удаления подстроки в n символов с k - ой позиции в строке.

//P3_5.CPP ¾ удаление подстроки

# include < iostream. h>

#include <string.h>

const int n = 50;

const int m = 5;

void del(char *st, int, int);

void main()

{

char st [n], st1 [m];

cout << "Введите строку "<< endl;

cin. getline(st,n);

cout << "Введите подстроку"<< endl;

cin >> st1;

del(st, strstr (st,st1) - st, strlen ( st1) );

cout << st << endl;

      }

      void del(char *st,int k,int n)

{

for( int i = k ; i < strlen ( st ); i++)

st[i] = st[i+n];

st[i] = '\0';

  }

void* memchr (const void *st, int s ,int n); ¾ функция ищет символ "s" в строке *st длиной n байт, т.е. в блоке памяти, на который указывает указатель st. Если символ s найден, функция возвращает указатель на этот символ, в противном случае возвращает NULL.

 

void* memcmp (const void *st, const void * s , n);      и

void* memicmp (const void *st, const void * s ,int count); ¾ функции сравнивают n байт из двух буферов на ее начало которых указывают s1 и s2.

Функции возвращает значение

< 0 ¾ если  s1 < s2;

=0 ¾ если s1 = s2;

>0 ¾ если s1 > s2;

 

char *strset (char *st, int ch); ¾ функция заполняет строку st символом ch и возвращает указатель на полученную строку. n - заполняет n - символов строки st

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

Эти функции находятся в файле <stdlib.h>

int atoi (const char *s); ¾ преобразует строку s в число типа int. Возвращается полученное число или 0, если встретится символ, который не может быть преобразован. Строка должна содержать корректное число, например "2345", и иметь следующую структуру:

 

[ побелы ] [знак числа] [ цифры].

long atol (const char *s); ¾ преобразует строку s в число типа long int   (аналогична функции atoi.)

double atof (const char *s); ¾ преобразует строку символов в число с плавающей точкой типа double. Если при преобразовании встречается символ, который не может быть преобразован функция возвращает 0.

Обрабатываемая строка должна иметь структуру:

[пробелы] [знак числа] [цифра. цифра] [буква е,Е,d или D] [знак порядка] [цифры порядка], например ”-12345.123 ” или ”-12. 345123 Е3 ”

 

char *ecvt (double vl, int n, int *dec, int *sign ); ¾ преобразует число vl в строку символов, количество которых равно n символов цифр. Положение десятичной точки от первой цифры числа возвращается в переменной, на которую указывает dec. Знак числа возвращается в переменную на которую указывает sign. Если sign = 0 ¾ число положительное, иначе ¾ отрицательное. Полученная строка хранится во внутренней памяти функции, указатель возвращается на начало сформированной строки.

 

сhar *fcvt (double vl, int n, int *dec, int *sign ); ¾ аналогична предыдущей функции, но для ecvt - параметр dec задают общее количество цифр, то для fcvt - количество цифр после десятичной точки.

сhar *gcvt (double vl, int n, сhar *buf); ¾ преобразует число vl в строку, которую помещает в буфер, указатель на начало которого является buf, n ¾ число цифр в символической записи преобразуемого числа. Полученная строка содержит символ знака числа и десятичной точки, если число содержит меньше десятичных цифр, чем n. В этом случае младшая цифра дробной части отбрасывается. Еcли преобразованное число не помещается в заданное количество цифр n, функция генерирует символьную запись в экспоненциальной форме, включая в строку символ Е и знак порядка. Функция возвращает указатель на начало сформированной строки.

strlen (st) - возвращает длину st без нуль - терминатора '\0'.

 

¾ Функции проверки символов

Эти функции находятся в файле <ctype.h>:

isgraph (s) ¾ возвращает значение ”истина” т.е. не нуль, если s является печатным символом и “ложь” (т.е. 0) , если s является пробелом или каким - либо не отображаемым символом.

isprint (s) ¾ возвращает значение ”истина” т.е. не нуль , если s является печатным символом, включая пробел и ”ложь” (т.е. 0) во всех остальных случаях. 

ispunct (s) ¾ возвращает значение "истина" т.е. не нуль , если s является знаком пунктуации(любой печатный символ кроме пробела и “ложь” (т.е. 0) в остальных случаях.

 

isdigit (s) ¾ возвращает значение "истина" т.е. не нуль , если s является цифрой от 0 до 9 и “ложь” (т.е. 0) в остальных случаях.

isalnum (s) ¾ возвращает значение "истина", т.е. не нуль, если s является цифрой или буквой (заглавной или срочной) и “ложь” (т.е. 0) во всех остальных случаях (т. е. поверяет алфавитные и цифровые символы).,

 

tolower (s) ¾ преобразует символ s к нижнему регистру;

 

toupper (s) ¾ преобразует символ s к верхнему регистру;

 

atoi (s) ¾ преобразует строку s к целое число;

 

atol (s) ¾ преобразует строку s к длинному целому;

 

atof (s) ¾ преобразует строку s к числу с плавающей точкой.

 

Рассмотрим ряд примеров с использованием строковых функций .

Пример 3.5  Ввести список фамилий (строк) и отсортировать его в алфавитном порядке.

 

//P3_5.CPP ¾ сортировка списка фамилий в алфавитном порядке

#include <iostream.h>

#include <string.h>

void main( )

 {

char mst[ 5] [15];

char *ps[5], *ptr;

int i, n, k;

cout << "Введите фамилии \n";

        for( i = 0; i < 5; i++)

    {

     gets (mst [i] );

     ps[i] = mst[i];

    }

cout << "\n\t Исходный список\n\n";

       for( i = 0; i < 5; i++)

   puts ( ps[ i ] );

 

// Сортировка массива

 

n = 5;

for (i = 1; i < n; i++)  // количество просмотров                                                                                      

for ( k = 0; k < ( n – i ); k++)

if ( strcmp ( ps[k], ps[k+1] ) > 0)

  {

   ptr = ps[k];

   ps[k] = ps[k+1];

   ps[k+1] = ptr;

  }

cout << "\n\n\t Отсортированный список \n\n";

for ( i = 0; i < 5; i++)

  puts ( ps[ i ] );

   }

Пример 3.6  Ввести строку и удалить в ней лишние пробелы.

 

//P3_6.CPP ¾ удаление лишних пробелов

# include < iostream. h>

#include <string.h>

void main()

{

char st[] = "Пришла весна в мои края.";

int i, n = 0;

for (i = 0; i < strlen(st); i++)

{

if (st[i] != ' ')

{

cout << st[i];

n=0;

}

else

n++;

if(n == 1) cout << st[i];

}

return 0;

}

 

Пример 3.7  Определить позицию вхождения подстроки в строку.

 

//P3_7.CPP ¾ поиск позиций вхождения подстроки в строку.

#include <iostream.h>

#include <string.h>

const int m = 50;

void main()

{

char *pt, mainstr[m], substr[m];

int n, k = 0;

cout << "Введите строку " << endl;

cin.getline ( mainstr, m);

cout << "Введите подстроку " << endl;

cin.getline ( substr, m);

cout << "Главная строка : " << mainstr << endl;

cout << "Подстрока : " << substr << endl;

pt = strstr ( mainstr, substr );

cout << "Номер входа подстроки в строку" << endl;

while (pt)

{

k++;

n = pt - mainstr;

cout << k << " n = " << n << endl;

pt = strstr( ++pt, substr );

/* cout << k << " ." << * pt << endl;*/

}

if ( k == 0) cout <<"Подстрока не содержится в строке" << endl;

       }

 

Пример 3.8 Найти заданый символ в строке.

 

//P3_8.CPP ¾ поиск символов в строке

#include <iostream.h>

#include <string.h>

Void main( )

{

const int m = 25;

char sim, *pt, str[m];

int n, k = 0;

cout << "Введите строку " << endl;

cin.get ( str, m );

cout << "Введите символ " << endl;

cin >> sim;

  pt = strchr ( str, sim );

cout << "Позиции входа символа в строку" << endl;

while (pt)

{

k++;

n = pt - str;

cout << k << " n = " << n << endl;

pt = strchr(++pt, sim);

}

 cout << "К -во вхождений ="<<k<<endl;

 if(k==0) cout << "Символ не входит в строку" << endl;

    }

 

Пример 3.9  Ввести список фамилий и вывести фамилии начинающиеся на буквы "П" и " и заканчивающиеся на "ко"

 

//P3_9.CPP ¾ вывести из списка фамилии, начинающиеся на

//                буквы "П" и "Ф" и заканчивающиеся на "ко"

#include <iostream.h>

#include <string.h>

void main()

{

const int n = 5;

char gr [ 5 ] [15], s2[2] = {"ко "};

int i;

cout << "Введите фамилии " << endl;

for(i = 0; i < n; i++)

       cin >> gr[i];

cout << "Список фамилий " << endl;

for ( i = 0; i < n; i++)

       cout << gr[i] << endl;

cout << "Фамилии на П и Ф" << endl;

for ( i = 0; i < n; i++)

  if ( ( ( gr [i] [0] == 'П ') || ( gr [i] [0] == 'Ф ') )

       && ( strncmp ( strrev ( gr[i] ), strrev ( s2 ),2) == 0))

cout << strrev( gr[i] ) << endl ;     

      }

 

 

3.2 Контрольные вопросы и задания

 

1. Что представляет собой значение символьного типа?

2. Как задается тип символьных данных?

3. Что представляет собой массив символьного типа?

4. Как вводятся строковые значения?

5. Как производится сравнение данных строкового типа?

6. Какое строковое данное больше “стол” или “стул”?

7. Приведите пример использования операции конкатенации?

8. Как определить количество символов входящих в строковое данное?

9. Какие функции языка С++ используются для выделения подстроки из строки?

 



2019-08-13 266 Обсуждений (0)
Основные функции обработки символьных типов 0.00 из 5.00 0 оценок









Обсуждение в статье: Основные функции обработки символьных типов

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (266)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)