Проверка принадлежности символа некоторому множеству — КиберПедия 

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Проверка принадлежности символа некоторому множеству

2020-08-21 255
Проверка принадлежности символа некоторому множеству 0.00 из 5.00 0 оценок
Заказать работу

# include < ctype. h>

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

прототип описание функции
int isdigit (int c) возвращает отличное от 0 значение, если элемент с является цифрой, в противном случае – 0
int isalfa (int c) возвращает отличное от 0 значение, если элемент с является буквой, в противном случае – 0
int isalnum (int c) возвращает отличное от 0 значение, если элемент с является цифрой или буквой, в противном случае – 0
int isxdigit (int c) возвращает отличное от 0 значение, если элемент с является 16-ичной цифрой, в противном случае – 0
int islower (int c) возвращает отличное от 0 значение, если элемент с является строчной буквой (нижний регистр), в противном случае – 0
int isupper(int c) возвращает отличное от 0 значение, если элемент с является прописной буквой (верхний регистр), в противном случае – 0
int isspace (int c) возвращает отличное от 0 значение, если элемент с является разделителем: переход на новую строку (‘\n’), пробел (‘ ‘), переход на новую страницу (‘\f’), горизонтальная табуляция (‘\t’), вертикальная табуляция (‘\v’), в противном случае – 0
int iscntrl (int c) возвращает отличное от 0 значение, если элемент с является управляющим символом (с кодами 0-31, 127), в противном случае – 0
int ispunct (int c) возвращает отличное от 0 значение, если элемент с является символом пунктуации, отличным от пробела, цифры или буквы, в противном случае – 0
int isprint (int c) возвращает отличное от 0 значение, если элемент с является любым печатным символом, включая пробел, в противном случае – 0
int isgraph (int c) возвращает отличное от 0 значение, если элемент с является печатным символом, отличным от пробела, в противном случае – 0

 

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

cout << ch << " = " << ch+0 << endl; (преобразование типа к целому)

 

Поиск строки в строке

Функция   char * strstr (char *s1, const char *search)

выполняет поиск строки search в строке s1 и возвращает указатель на первое вхождение search в строку s1. Если строка не обнаружена, то возвращается указатель NULL.

const int MAX = 80;               

char s1[MAX]="abcdef", s2[MAX]="cd";

char * s = strstr(s1, s2);                   

if (s) cout<<" n =" << int(s-s1) << endl; //n=2 - позиция строки

 

Функция  size_t strspn (const char *s1, const char * charSet)

определяет и возвращает длину начальной части строки s1, состоящей только из символов, содержащихся в строке charSet. 0-символ в сравнении не участвует.

const int MAX = 80;               

char s1[MAX]="abcdef", s2[MAX]="aabb";

size_t n = strspn(s1, s2); //2

 

Функция size_t strcspn (char *s1, const char *charSet)

определяет и возвращает длину начальной части строки s1, состоящей из символов, не содержащихся в строке charSet. 0-символ в сравнении не участвует. Если строка s1 начинается с символа, встречающегося в строке charSet, возвращается нуль. Если строка s1 не содержит ни одного символа строки charSet, возвращаемое значение совпадает с длиной строки s1.

const int MAX = 80;           

char s1[MAX]="abcdef", s2[MAX]="aabb";

size_t n = strcspn(s1, s2); //0

 

Функция   char * strpbrk (char *s1, const char *s2)

возвращает указатель на символ, являющийся первым вхождением любого из символов строки s2 в строку s1. Если символ не найден, то возвращается указатель NULL.

const int MAX = 80;               

char s1[MAX]="abcdef", s2[MAX]="cf";

char *s= strpbrk(s1, s2);   

cout << int(s-s1) << endl; //2

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

 (< stdlib. h>, <с stdlib>)

преобразование строки в число

Преобразуемая в число строка может содержать:

· последовательность цифр;

· запись вещественного числа в форме с фиксированной точкой или в экспоненциальной форме (с наличием десятичной точки,  цифр порядка и символов е или Е, например, 12.345Е- 2);

· символы пробела, табуляции, знака числа.

 

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

  

Функция double atof (char *s)

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

char st[10]=" 1.2e02. ";

  double d = atof(st);

cout<<d<<endl;     //120

 

Функция int atoi (char *s)

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

char st[10]="125.";

int d = atoi(st);

 cout<<d<<endl;     //125

 

Функция long atol (char *s)

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

char st[10]="1234567 a a";

long d = atoi(st);

cout<<d<<endl;     //1234567

Функция    long strtol (const char *s, char **endptr, int base)

преобразует строку s, содержащую символьное представление целого числа, в соответствующее десятичное длинное целое число в системе счисления base; признаком конца числа служит первый символ строки endptr, который не может быть интерпретирован как принадлежащий числу.

#include <stdlib.h>      

int main()

{  

  const int MAX = 80;                       

char str[MAX] = "a";           

char *endptr;

long il;

     

il = strtol(str, &endptr, 2);

cout<<il<< " "<<endptr <<endl; // 0 a, а является ошибочным символом в 10 с/с  

cout<<endl;

il = strtol(str, &endptr, 16);   

cout<<il<< " "<<endptr <<endl; //10     

   _getch();

  return 0;

Функция    double strtod (const char *s, char **endptr)

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

 

#include <stdlib.h>      

int main()

{  

  const int MAX = 80;               

char str[MAX]="3.1415", str1[MAX]="3.1415e+00",str2[MAX]="3.14 # 00";
char *endptr;

double d;

           

d = strtod(str, &endptr);

cout<<d<<" " << endptr<<endl; //3.1415    

         

d = strtod(str1, &endptr);

cout<<d<<" " << endptr<<endl; //3.1415    

        

d = strtod(str2, &endptr);

cout<<d<<" " << endptr<<endl; //3.14 # 00  

_getch();

return 0;

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

Функция char * itoa (int i, char *s, int c)

преобразует целое i (переведенное в с/с 2< c <36) в строку s; c – основание системы счисления.

char st[10]="";

int i = 120;

itoa(i, st, 10);              // warning C4996: 'itoa' was declared deprecated

   cout<<st<<endl;     //120

itoa(i, st, 16);              // warning C4996: 'itoa' was declared deprecated

cout<<st<<endl;     //78

itoa(i, st, 2);                // warning C4996: 'itoa' was declared deprecated

cout<<st<<endl;      //1111000

 

Функция errno_t _itoa_s (int value, char * buffer, size_t sizeInCharacters, int radix);

Возвращает 0 при успешном завершении и код ошибки – в противном случае.

 

char st[10]="";

int i = 120;

_itoa_s (i, st,10, 10);         

cout<<st<<endl;     //120

_itoa_s (i, st,10, 16);             

cout<< st<<endl;     //78

_itoa_s (i, st,10, 2);               

cout<< st<<endl;     //1111000

 

Шаблонная функция (только в С++)

template <size_t size>

errno_t _itoa_s (int value, char (*buffer)[ size], int radix);

позволяет вызывать функцию в привычном виде:

char st[10]="";

int i = 120;

_itoa_s (i, st, 10);              

 cout<<st<<endl;     //120

_itoa_s (i, st, 16);              

cout<<st<<endl;     //78

_itoa_s (i, st, 2);                

cout<<st<<endl;     //1111000

 

Функция char * ltoa (long il, char *s, int c)

преобразует длинное целое il (переведенное в с/с 2< c <36) в строку s; c – основание системы счисления (2<c<36) (аналогично i toa()).

Функция char * ultoa (unsigned long ul, char *s, int c)

преобразует беззнаковое длинное целое ul (переведенное в с/с 2< c <36) в строку s;
c – основание системы счисления (2<c<36) (аналогично i toa() и ltoa()).

 

Функция char * fcvt (double value, int count, int * dec, int * sign)

возвращает строку, в которую преобразует вещественное число value, для которого задано количество цифр в дробной части строкового представления(count); функция возвращает такжеколичество цифр в целой части (dec), и знак числа (sign).
int drob=5, celoe, sign;

char *stroka;

double d=3.141592;

stroka = fcvt(d, drob, &celoe, &sign);
                               // warning C4996: 'fcvt' was declared deprecated                         

cout<< stroka <<" "<< celoe<<" "<< sign<<endl; //314159 1 0

 

Функция errno_t _ fcvt _s (char * buffer, size_t sizeIn Bytes, double value, int count,
                                                                       int * dec, int * sign)

возвращает 0 при успешном завершении и код ошибки – в противном случае.

 

int drob=5, celoe, sign;

char stroka[20];

double d=3.141592;

_fcvt_s (stroka, 20, d, drob, &celoe, &sign);                            

   cout<< stroka <<" "<< celoe<<" "<< sign<<endl; //314159 1 0

 

Шаблонная функция (только в С++)

template <size_t size>

errno_t _fcvt_s (char (*buffer)[ size], double value, int count, int * dec, int * sign)

позволяет вызывать функцию в виде:

int  drob=5, celoe, sign;

char stroka[20];

double d=3.141592;

_fcvt_s (stroka, d, drob, &celoe, &sign);                            

cout<< stroka <<" "<< celoe<<" "<< sign<<endl; //314159 1 0

преобразование строчных символов строки в прописные и наоборот

 

int tolower (int c) преобразует прописные латинские буквы в строчные
int toupper (int c) преобразует строчные латинские буквы в прописные

Функция char * strupr (char *s)

преобразует все символы строчных букв строки s в символы прописных букв и возвращает указатель на ее начало.

const int MAX = 80;               

char str[MAX]="abcdef";

char * s;

s = strupr(str); // warning C4996: 'strupr' was declared deprecated

cout<<s<<endl;   //ABCDEF

 

Функция errno_t _strupr_s (char * str, size_t sizeIn Bytes)

возвращает 0 при успешном завершении и код ошибки – в противном случае.

 

const int MAX = 80;               

char str[MAX]="abcdef";

_strupr_s(str, MAX);     

cout<<str<<endl;  //ABCDEF

 

Шаблонная функция (только в С++)

template <size_t size>

errno_t _strupr_s (char (*str)[ size])

позволяет вызывать функцию в виде:

const int MAX = 80;               

char str[MAX]="abcdef";

_strupr_s(str);     

cout<<str<<endl;  //ABCDEF

 

Функция char * strlwr (char *s)

преобразует все символы прописных букв строки s в символы строчных букв и возвращает указатель на ее начало.

const int MAX = 80;               

char str [MAX]="ABCDEFG";

char * s;

s = strlwr(str); // warning C4996: 'strlwr' was declared deprecated

cout<<s<<endl;     //abcdefg  

Функция errno_t _strlwr_s (char * str, size_t sizeIn Bytes);

возвращает 0 при успешном завершении и код ошибки – в противном случае.

 

const int MAX = 80;               

char str [MAX]="ABCDEFG";

_strlwr_s(str,MAX);  

cout<<str<<endl;     //abcdefg  

 

Шаблонная функция (только в С++)

template <size_t size>

errno_t _strlwr_s (char (*str)[ size]);

позволяет вызывать функцию в виде:

const int MAX = 80;             

char str [MAX]="ABCDEFG";

_strlwr_s(str);  

cout<<str<<endl;    //abcdefg 

Реверс строки

Функция char * strrev (char *s)

возвращает указатель на начало строки, полученной в результате реверса строки s.

Заполнение строки символом

Функция char * strset (char *s, int ch)

помещает символ ch во все позиции строки s.

пример применения функций преобразования

//пример_5

#include <cstdlib>

int main()

{

char a[ ] = "10) rost – 162 cm, ves – 59.5 kg";

int num;

long rost;

double ves;

num = atoi(a);       //преобразование, начиная с символа 1 с индексом 0 и до символа ‘)’

rost = atol (&a[11]); //преобразование, начиная с символа 1 с индексом 11 и до ‘пробела’

ves = atof (&a[25]); //преобразование, начиная с символа 5 с индексом 25 и до ‘пробела’

cout << num << " " << rost << " " << ves; //10 162 59.5

_getch();

return 0;

}

Выделение лексем

Функция char * strtok (char *s1, const char *s2)

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

#include <string.h>

int main()

{ char string[ ] = "this sentence;has-5words.";

char *tokenPtr;

cout << string << endl << "by the words:" << endl;

tokenPtr = strtok (string, ";-."); //пробел,;, -,.    – разделители

while (tokenPtr!=NULL)

{cout << tokenPtr << endl;

tokenPtr = strtok (NULL,";-."); //при последующем вызове

                  //нулевой указатель передается в качестве первого параметра

}

_getch();

return 0;

}

Вызов tokenPtr = strtok (NULL,";-."); трактуется так, будто первый аргумент указывает на символ, следующий непосредственно после 0-символа, записанного в строку stringпосле первого выделения лексемы. Таким образом, в нашем примере, после выделения первого слова указатель token содержит адрес первого символа еще не просмотренной части строки. После просмотра всей строки он будет указывать на символ-разделитель в конце строки (‘.’).

Очевидно, что при включении в список разделителей символов, завершающих предложение (.!?), мы получим выделение в качестве лексем – предложений, а при включении в список разделителей символов, разделяющих слова (пробел.,; –), мы получим выделение в качестве лексем – слов.

Внимание!!! Функция strtok  изменяет строку, разбиваемую на лексемы, поэтому при необходимости дальнейшего использования строки необходимо позаботиться о ее предварительном сохранении.

Работа с блоками памяти

# include <string. h>

# include <mem.h>

прототип описание функции
void *memccpy (void *dest, const void *src, int c, size_t n) копирует блок памяти из буфера-источника src в буфер dest, пока общее число перенесенных байтов не достигнет значения n или пока не встретится в src байт, содержащий символ c
void *memchr (const void *s, int c, size_t n) возвращает указатель на символ c, найденный при просмотре n байтов буфера s; если символ не найден, возвращается NULL
int memcmp (const void *s1, const void *s2, size_t n) сравнивает n первых байтов буферов s1 и s2 (байты трактуются как символы); возвращает значение, меньшее нуля, если s1 < s2; равное нулю, если s1= s2; большее нуля, если  s1 > s2
int memicmp (const void *s1, const void *s2, size_t n) сравнивает n первых байтов буферов s1 и s2 (байты трактуются как символы, преобразованные в строчные буквы); возвращает значение, меньшее нуля, если s1 < s2; равное нулю, если s1= s2; большее нуля, если  s1 > s2
void *memcpy (void *dest, const void *src, size_t n) копирует n байтов из буфера-источника src в буфер-назначение dest; буферы не должны перекрываться в памяти; возвращает указатель на dest
void *memmove (void *dest, const void *src, size_t n) копирует n байтов из буфера-источника src в буфер-назначение dest; буферы могут перекрываться в памяти; возвращает указатель на dest
void *memset (void *s, int c, size_t n) устанавливает n байтов буфера s в заданное значение c; возвращается указатель на буфер s

 

Динамические строки

Память под строки, как и под другие массивы, может выделяться как компилятором, так и непосредственно в программе. Как мы видели, длина статической строки должна быть только константным выражением. Чаще всего она задается именованной константой (как частным случаем константного выражения). Длина динамической строки может задаваться выражением, вычисляемым в ходе выполнения программы.

Для размещения строки в динамической памяти описываем указатель на char и выделяем память с помощью new или malloc.

char *p = new char [m];

char *q = (char *) malloc(m*sizeof(char));


Поделиться с друзьями:

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.104 с.