- •Основные понятия
- •Определение С-строк
- •строка как массив символов
- •строка как указатель на char
- •особенности работы с С-строками в С++
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •преобразование значения базового типа в С-строку
- •ввод ограниченного числа символов строки
- •функция вывода строки
- •особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с С-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •преобразование строки в число
- •преобразование строчных символов строки в прописные и наоборот
- •реверс строки
- •заполнение строки символом
- •пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками
- •Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
void scpy (char*, char*); |
//prototype |
|
|
int main() |
|
|
{ |
|
|
char* str1 = " Press any key!"; |
|
|
char str2[80]; |
//copy str1 to str2 |
|
scpy (str2, str1); |
|
|
cout << str2 << endl; |
//display str2 |
|
_getch(); |
|
|
return 0; |
|
|
} |
|
//-------------------------------------------------------------- |
|
|
void scpy (char s[], char t[]) |
|
|
{ |
|
|
int i=0; |
|
|
while ((s[i] = t[i]) !='\0') |
|
|
} |
i++; |
|
|
|
или
void scpy (char *s, char *t)
{
while ((*s =*t) !='\0')
{s++; t++;}
}
или
void scpy (char *s, char *t)
{
while ((*s++ = *t++) !='\0');
}
или
void scpy (char *s, char *t) {}while (*s++ =*t++);
Функции для работы с С-строками
#include <string.h>
Определение длины строки
Функция size_t strlen (const char *str)
возвращает количество символов в строке str (длину строки), не включая 0-символ.
const int MAX = 80;
char s1[MAX] = "abcdef";
cout << strlen(s1) << endl; // 6
Копирование строк
Функция char* strcpy (char *strDest, const char *source)
копирует все символы строки source, включая завершающий 0-символ, в строку strDest и возвращает указатель на ее начало. В строке strDest должно быть не менее strlen(source) + 1 байтов.
const int MAX = |
80; |
|
char s1[MAX]="abcdef", s2[MAX]="cd"; |
||
strcpy(s1, s2); |
//cd |
warning C4996 'strcpy' was declared deprecated |
Функция errno_t |
strcpy_s (char *strDest, size_t sizeInBytes_strDest, const char *strSource) |
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
13 |
|
возвращает 0 при успешном завершении и код ошибки – в противном случае:
EINVAL (22) – Invalid argument или ERANGE ( ) – Result too large.
Функция strcpy_s копирует содержимое strSource, включая пустой символ завершения, в strDest. Строка должна быть достаточно большой для хранения исходной строки, включая завершающий нулевой символ. Поведение
strcpy_s не определено, если исходная и целевая строки накладываются. const int MAX = 80;
char |
s1[MAX]="abcdef", s2[MAX]="cd"; |
|
strcpy_s(s1, MAX, s2); |
//cd |
|
cout |
<< s1 << endl; |
|
Шаблонная функция (только в С++) template <size_t size>
errno_t strcpy_s (char (&strDest)[size], const char *strSource);
позволяет вызывать функцию в привычном виде:
strcpy_s (s1,s2); //cd
Функция char* strncpy (char * strDest, const char * strSource, size_t count)
копирует не более count символов строки strSource, включая 0-символ, в строку strDest и возвращает указатель на начало строки strDest. Если 0-символ встретился в исходной строке strSource раньше, то копирование прекращается, а оставшиеся до count символы строки strDest заполняются 0-символами. В противном случае (если count меньше или равно длине строки strSource) 0-символ в strDest не добавляется.
const int MAX = |
80; |
|
|
char s1[MAX]="abcdef", s2[MAX]="cd"; |
|||
strncpy(s1, s2, 1); |
//cbcdef |
warning C4996: 'strncpy' was declared deprecated |
|
strncpy(s1, s2, 4); |
//cd |
warning C4996 |
|
char ss1[MAX]="cd",ss2[MAX]="abcdef" ; |
|||
strncpy(ss1, ss2, 1); |
//ad |
warning C4996: 'strncpy' was declared deprecated |
|
strncpy(ss1, ss2, 4); |
//abcd |
warning C4996 |
|
strncpy(ss1, ss2, 6); |
//abcdef warning C4996 |
||
Функция errno_t |
strncpy_s(char *strDest, size_t sizeInBytes_strDest, const char *strSource, size_t count); |
возвращает 0 при успешном завершении и код ошибки – в противном случае;
Функция пытается скопировать первые D символов strSource в strDest, где D является меньшим значением из количества элементов count и длины строки strSource. Если эти D символов вписываются в strDest (как sizeInBytes) и еще остается место для нулевого символа, то символы копируются, и добавляется завершающий нулевой символ, иначе strDest[0] устанавливается на нулевой символ и возвращается значение EINVAL (22) – Invalid argument.
const int MAX |
= 80; |
|
||
int count= |
9; |
|
|
|
char |
s1[MAX]="abcdef", s2[MAX]="cdefghjklmn"; |
|||
strncpy_s(s1, |
MAX, s2, count); |
//cdefghjkl |
||
cout |
<< s1 |
<< |
endl; |
Шаблонная функция (только в С++) template <size_t size>
errno_t strncpy_s (char (&strDest)[size], const char *strSource, size_t count);
позволяет вызывать функцию в привычном виде:
const int MAX = 80; int count=2;
char s1[MAX]="abcdef", s2[MAX]="cdefghj\0klmn"; strncpy_s(s1,s2,count);
cout << s1 << " " << count << endl; //cd
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
14 |
|
Объединение строк
Функция char* strcat (char* strDest, const char* source)
добавляет копию строки source, включая 0-символ, в конец стр оки strDest. Начальный символ строки source записывается поверх 0-символа в конце строки strDest. Функция возвращает указатель на начало результирующей строки strDest, которая заканчивается 0-символом и должна иметь размер не менее strlen(strDest) + strlen(source) + 1 байтов.
const int MAX = 80; char s1[MAX] = "a";
char s2[MAX] = "b";
cout << strcat(s1,s2) << endl; cout << s1 << endl;
char* s;
cout << (s= strcat(s1, s2))<< endl;//abb warning C4996
Функция errno_t strcat_s (char *strDest, size_t sizeInBytes_strDest, const char *strSource);
возвращает 0 при успешном завершении и код ошибки – в противном случае.
Функция добавляет strSource к strDest и возвращает в результате строку с нулевым символом. 0-символ strSource заменяет 0-символ strDest. Поведение strcat_s не определено, если исходная и целевая строки накладываются.
код ошибки: EINVAL (22) – Invalid argument или ERANGE ( ) – Result too large. |
|
char buf[16]; |
|
strcpy_s(buf, 16, "Start"); |
|
strcat_s(buf, 16, " End"); |
// Start End |
cout << buf << endl; |
|
const int MAX = 80; |
|
char s1[MAX] = "a"; |
|
char s2[MAX] = "b"; |
|
strcat_s(s1, MAX, s2); |
//ab |
cout << s1<< endl; |
|
Шаблонная функция (только в С++) |
|
template <size_t size> |
|
errno_t strcat_s(char (&strDes)[size], |
const char *source ); |
позволяет вызывать функцию в привычном виде:
const int MAX = 80; |
|
|||
char s1[MAX] |
= |
"a"; |
|
|
char |
s2[MAX] |
= |
"b"; |
|
strcat_s(s1,s2); |
//ab |
|||
cout |
<< s1 << endl; |
Функция char* strncat (char* strDest, const char* source, size_t count)
позволяет добавить не более чем count символов строки source в конец строки strDest и возвращает указатель на strDest. В строке strDest должно быть не менее strlen(strDest) + strlen(source) + 1 байтов.
int count =2; |
= 80; |
|
const int MAX |
|
|
char s1[MAX] = "aaa"; |
|
|
char s2[MAX] = "bb"; |
//warning C4996: 'strncat' was declared deprecated |
|
strncat(s1,s2,count); |
||
cout << s1 << |
endl; |
//aaabb |
char *s_res = |
strncat(s1,s2,count); |
|
cout << s_res |
<< endl; |
//aaabbbb |
Функция errno_t strncat_s (char *strDest, size_t sizeInBytes_strDest, const char *strSource, size_t count)
возвращает 0 при успешном завершении и код ошибки – в противном случае.
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
15 |
|
Функция добавляет strSource к strDest и возвращает в результате строку с нулевым символом. Первоначальный 0- символ strSource перезаписывает завершающий 0-символ strDest. Поведение strcat_s не определено, если исходная и целевая строки накладываются.
код ошибки: EINVAL (22) – Invalid argument или ERANGE ( ) – Result too large.
const int MAX |
= 80; |
|
int count =2; |
= "a"; |
|
char s1[MAX] |
|
|
char s2[MAX] |
= "bbb"; |
|
strncat_s(s1, |
MAX, s2, count); |
|
cout << s1<< |
endl; |
//abb |
Шаблонная функция (только в С++) template <size_t size>
errno_t strncat_s (char (&strDest)[size], const char *source , size_t count);
позволяет вызывать функцию в привычном виде:
int count=2;
const int MAX = 80; char s1[MAX] = "aaa";
char s2[MAX] = "bbb"; strncat_s(s1,s2, count);
cout << s1 << endl; //aaabb
Сравнение строк
Функция int strcmp (char *s1, const char *s2)
сравнивает 2 строки в лексикографическом (т.е. упорядоченном по алфавиту) порядке с учетом различия прописных и строчных букв (рассматриваются первые символы, если они одинаковы, то рассматриваются вторые символы, третьи и т.д.). Функция возвращает 0, если строки равны; возвращает значение < 0, если первая строка меньше, чем вторая; и возвращает значение > 0, если первая строка больше, чем вторая.
cout << strcmp("abc", "ABC")<< endl; // возвращает 1 cout << strcmp("ABC", "ABC")<< endl; // возвращает 0 cout << strcmp("ABB", "ABC")<< endl; // возвращает -1
Функция int strncmp (char *s1, const char *s2, size_t n)
проводит сравнение только первых n символов двух строк: функция возвращает 0, если подстроки равны; возвращает значение < 0, если первая подстрока меньше, чем вторая; и возвращает значение > 0, если первая подстрока больше, чем вторая.
int count=2;
cout << strncmp("abc", "ABC", count)<< endl; // возвращает значение > 0 cout << strncmp("ABC", "abc", count)<< endl; // возвращает значение < 0 cout << strncmp("ABB", "ABC", count)<< endl; // возвращает 0
Функция int stricmp (char *s1, const char *s2)
позволяет сравнивать строки без учета регистра, т.е. без различия между прописными и строчными буквами. Она преобразует все буквы строк s1 и s2 в строчные буквы и сравнивает затем строки в лексикографическом порядке.
cout << stricmp("abc", "ABC")<< endl; // возвращает 0
// warning C4996: 'stricmp' was declared deprecated
cout << stricmp("ABC", "ABC")<< endl; // возвращает 0
//warning C4996
cout << stricmp("Ab", "ABC")<< endl; // возвращает значение < 0 // warning C4996
cout << stricmp("ABd", "abc")<< endl; // возвращает значение > 0 // warning C4996
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
16 |
|