- •Основные понятия
- •Определение С-строк
- •строка как массив символов
- •строка как указатель на char
- •особенности работы с С-строками в С++
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •преобразование значения базового типа в С-строку
- •ввод ограниченного числа символов строки
- •функция вывода строки
- •особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с С-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •преобразование строки в число
- •преобразование строчных символов строки в прописные и наоборот
- •реверс строки
- •заполнение строки символом
- •пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками
- •Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
int main()
{
char str[] = "Idle people have the least leisure."; |
|
// или char *str = "Idle people have the least leisure."; |
|
dispstr(str); |
//вызов функции вывода строки |
_getch(); |
|
return 0; |
|
} |
|
//-------------------------------------------------------------- |
//функция вывода строки |
void dispstr(char* ps) |
|
{ |
|
while( *ps ) |
|
cout << *ps++; |
|
cout << endl; |
|
} |
|
или |
|
//-------------------------------------------------------------- |
//функция вывода строки |
void dispstr(char ps[]) |
|
{int i=0; |
|
while( ps[i]!='\0' ) |
|
cout << ps[i++]; cout << endl;
}
особенности посимвольного вывода строки
int main()
{
static char h[ ]="Press any key!"; //h – указатель-константа на неконстантные данные static char *hd=" Press any key!"; //hd–неконстантный указатель на константные данные
int i; |
|
// или |
h[i] |
ok!!! |
for (i=0; i<15; i++) putchar (*(h+i)); |
||||
putchar |
('\n'); |
// или |
hd[i] |
ok!!! |
for (i=0; i<15; i++) putchar (*(hd+i)); |
||||
putchar |
('\n'); |
|
|
|
while (*hd !='\0') putchar (*hd++); |
// ok!!!, неконстантный указатель |
|||
putchar |
('\n'); |
|
|
|
//while |
(*h !='\0') putchar (*h++); |
//error!!!, указатель-константа |
||
putchar |
('\n'); |
|
|
|
_getch(); |
|
|
|
|
return |
0; |
|
|
|
} |
|
|
|
|
Копирование строк
Для С-строк (исключая инициализацию) не определена операция присваивания,
поскольку строка не является базовым типом данных. Копирование строк выполняется с помощью функций стандартной библиотеки или посимвольно «вручную».
Копирование строк «вручную»:
#include <cstring> |
//for strlen() |
int main() |
"Oh, Captain, my Captain! " |
{ char str1[] = |
|
const int MAX = |
"our fearful trip is done"; |
80; |
|
char str2[MAX]; |
|
unsigned j; |
|
for(j=0; j<strlen(str1); j++) |
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
11 |
|
str2[j] = str1[j];
str2[j] = '\0';
cout << str2 << endl; _getch();
return 0;
}
или, как и для массивов, !!!
#include <сstring> |
|
|||
char |
s[9]; |
|
|
|
char |
hello[] = "motor"; |
//копирование области памяти указанного размера |
||
memcpy |
(s, |
hello, sizeof (hello)); |
||
cout<< |
s<< |
endl; |
// motor |
Обратите внимание, что в результате операции sizeof (hello) получим значение размера строки 6=5+1(завершающий ‘\0’). Если же определять длину строки с помощью функции strlen(hello), то получим значение, равное 5 (без учета последнего ‘\0’).
Копирование строк с помощью функции пользователя:
//прототипы функций
void vvodstr (char*, const int); |
//ввод строки |
|
void vyvodstr (char*); |
//вывод строки |
|
void copystr (char*, const char*); //копирование строки |
||
int main() |
|
|
{const int MAX=80; |
|
|
char str1[MAX]; |
|
|
char str2[MAX]; |
|
|
vvodstr |
(str1, MAX); |
|
vyvodstr |
(str1); |
|
copystr(str2, str1); |
|
|
cout << "new "; |
|
|
vyvodstr |
(str2); |
|
_getch(); |
|
|
return 0; |
|
|
} |
|
|
//-------------------------------------------------------------- |
|
|
void vvodstr(char* st, int n) |
|
|
{cout << "string? " << endl; |
|
|
cin.getline(st, n); |
|
|
} |
|
|
//--------------------------------------------------------------
void vyvodstr(char* st)
{cout << "string : " << endl; cout << st << endl;
}
//-------------------------------------------------------------- |
copystr(char* dest, const char* src) |
|
void |
||
{ |
|
//пока не нуль-символ |
while( *src ) |
||
|
*dest++ = *src++; |
//копировать символ из src в dest |
*dest = '\0'; |
//завершить строку dest нуль-символом |
|
} |
|
|
Оптимизация текста программы на примере функции копирования
Проследим возможности Си++ по «оптимизации» текста на примере функции копирования:
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
12 |
|