- •Основные понятия
- •Определение С-строк
- •строка как массив символов
- •строка как указатель на char
- •особенности работы с С-строками в С++
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •преобразование значения базового типа в С-строку
- •ввод ограниченного числа символов строки
- •функция вывода строки
- •особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с С-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •преобразование строки в число
- •преобразование строчных символов строки в прописные и наоборот
- •реверс строки
- •заполнение строки символом
- •пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками
- •Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
Функция int _stricmp (const char *s1, const char *s2) работает аналогично, но уже не
выдает предупреждений: |
||
cout << |
_stricmp("abc", "ABC")<< endl; // возвращает 0 |
|
cout << |
_stricmp("ABC", "ABC")<< endl; // возвращает 0 |
|
cout |
<< |
_stricmp("Ab", "ABC")<< endl; // возвращает значение < 0 |
cout |
<< |
_stricmp("ABd", "abc")<< endl; // возвращает значение > 0 |
Функция int strnicmp (char *s1, const char *s2, size_t n)
проводит сравнение только первых n символов двух строк без учета регистра, т.е. без различия между прописными и строчными буквами.
cout << strnicmp("abc", "ABC", 2)<< endl; // возвращает 0
// warning C4996: 'strnicmp' was declared deprecated cout << strnicmp("ABC", "AaC", 2)<< endl; // возвращает значение > 0
// warning C4996
cout << strnicmp("Ab", "ABC", 2)<< endl; // возвращает 0 // warning C4996
cout << strnicmp("ABd","acc",2)<< endl; //возвращает значение < 0 // warning C4996
Функция int _strnicmp (const char *s1, const char *s2, size_t count) работает аналогично,
но уже не выдает предупреждений: |
// возвращает 0 |
|||
cout << |
_strnicmp("abc", "ABC", 2)<< endl; |
|||
cout << |
_strnicmp("ABC", "AaC", 2)<< endl; |
// |
возвращает значение > 0 |
|
cout |
<< |
_strnicmp("Ab", "ABC", 2)<< endl; |
// |
возвращает 0 |
cout |
<< |
_strnicmp("ABd","acc",2)<< endl; |
//возвращает значение < 0 |
Поиск символа в строке
Функция char * strchr (const char *s, int c)
выполняет поиск символа с кодом c в строке s слева направо и возвращает
указатель на позицию его первого вхождения в строку s. Если символа нет, то возвращается указатель NULL. 0-символ также включается в поиск, поэтому функция может использоваться для поиска в строке позиции 0-символа.
const int |
MAX = |
80; |
|
||
char c='\0'; |
|
|
|||
char |
s1[MAX]="ab\0cdef"; |
//указатель на символ |
|||
char |
* |
s= |
strchr(s1, c); |
||
if (s) |
cout<<" n |
=" << int(s-s1) << endl; |
//n=2 - позиция символа |
Функция char * strrchr (const char *s, int c)
выполняет поиск символа с кодом c в строке s справа налево и возвращает указатель на позицию его последнего вхождения в строку s. Если символа нет, то возвращается указатель NULL. 0-символ также включается в поиск, поэтому функция может использоваться для поиска в строке позиции 0-символа.
const int MAX = |
80; |
|
|
char c='\0'; |
|
|
|
char |
s1[MAX]="ab\0cdef"; |
//указатель на символ |
|
char |
*s= strrchr(s1, c); |
||
if (s) cout<<" n |
=" << int(s-s1) << endl; |
//n=2 - позиция символа |
Проверка принадлежности символа некоторому множеству
#include <ctype.h>
Функции данной группы можно использовать для проверки принадлежности символа множеству букв, разделителей, знаков пунктуации, цифр и т.д.
прототип |
описание функции |
|
int isdigit (int c) |
возвращает отличное от 0 значение, если элемент с является |
|
|
цифрой, в противном случае – 0 |
|
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
17 |
|
|
|
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 |
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
18 |
|