- •Основные понятия
- •Определение С-строк
- •строка как массив символов
- •строка как указатель на char
- •особенности работы с С-строками в С++
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •преобразование значения базового типа в С-строку
- •ввод ограниченного числа символов строки
- •функция вывода строки
- •особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с С-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •преобразование строки в число
- •преобразование строчных символов строки в прописные и наоборот
- •реверс строки
- •заполнение строки символом
- •пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками
- •Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
Функция 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); |
//120 |
cout<<d<<endl; |
Функция int atoi (char *s)
преобразует строку s, содержащую символьное представление целого числа, в соответствующее десятичное целое число; признаком конца числа служит первый символ, который не может быть интерпретирован как принадлежащий числу.
char st[10]="125."; |
|
int d = atoi(st); |
//125 |
cout<<d<<endl; |
Функция long atol (char *s)
преобразует строку s, содержащую символьное представление целого числа, в
соответствующее десятичное длинное целое число; признаком конца числа служит |
||
первый символ, который не может быть интерпретирован как принадлежащий числу. |
||
char |
st[10]="1234567aa"; |
|
long |
d = atoi(st); |
//1234567 |
cout<<d<<endl; |
Функция long strtol (const char *s, char **endptr, int base)
преобразует строку s, содержащую символьное представление целого числа, в соответствующее десятичное длинное целое число в системе счисления base;
признаком конца числа служит первый символ строки endptr, который не может быть интерпретирован как принадлежащий числу.
#include <stdlib.h> int main()
{
const int MAX = 80;
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
19 |
|
char |
str[MAX] = "a"; |
char |
*endptr; |
long |
il; |
il = strtol(str, &endptr, 2); |
//0 a, а является ошибочным символом в 10 с/с |
|
cout<<il<< " |
"<<endptr <<endl; |
|
cout<<endl; |
|
|
il = strtol(str, &endptr, 16); |
//10 |
|
cout<<il<< " |
"<<endptr <<endl; |
|
_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); |
//3.1415 |
||
cout<<d<<" |
" << endptr<<endl; |
||
d = strtod(str2, &endptr); |
//3.14 #00 |
||
cout<<d<<" |
" << endptr<<endl; |
_getch(); return 0;
}
преобразованиечисла в строку
Функция char * itoa (int i, char *s, int c)
преобразует целое i (переведенное в с/с 2<c<36) в строку s; c – основание системы счисления.
char st[10]=""; |
|
|
int i = |
120; |
//warning C4996: 'itoa' was declared deprecated |
itoa(i, |
st, 10); |
|
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); |
//120 |
cout<<st<<endl; |
|
_itoa_s(i, st,10, 16); |
//78 |
cout<< st<<endl; |
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
20 |
|
_itoa_s(i, st,10, 2); |
//1111000 |
cout<< st<<endl; |
Шаблонная функция (только в С++) 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); |
//78 |
cout<<st<<endl; |
|||
_itoa_s (i, |
st, |
2); |
//1111000 |
cout<<st<<endl; |
Функция char * ltoa (long il, char *s, int c)
преобразует длинное целое il (переведенное в с/с 2<c<36) в строку s; c – основание системы счисления (2<c<36) (аналогично itoa()).
Функция char * ultoa (unsigned long ul, char *s, int c)
преобразует беззнаковое длинное целое ul (переведенное в с/с 2<c<36) в строку s; c – основание системы счисления (2<c<36) (аналогично itoa() и 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 sizeInBytes, 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
преобразование строчных символов строки в прописные и наоборот
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
21 |
|
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); cout<<s<<endl;
Функция errno_t _strupr_s (char *str, size_t sizeInBytes)
возвращает 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; |
//warning C4996: 'strlwr' was declared deprecated |
s = strlwr(str); |
|
cout<<s<<endl; |
//abcdefg |
Функция errno_t _strlwr_s (char *str, size_t sizeInBytes); |
|
возвращает 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); |
//abcdefg |
cout<<str<<endl; |
реверс строки
Функция char * strrev (char *s)
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
22 |
|