Стандартные функции обработки строк
Язык С++ поддерживает множество функций обработки строк. Для операций со строками используются функции стандартной библиотеки, находящиеся в заголовочном файле <cstring>. Рассмотрим наиболее часто используемые из них функции.
strlen() – функция вычисления длины строки. Её прототип имеет вид:
unsigned strlen(char* str);
Аргумент функции – строка, длина которой вычисляется. Возвращаемое значение функции является целым числом, величина которого равна длине строки без учета завершающего нулевого символа.
strcpy() – функция копирования одной строки в другую. Её прототип:
char* strcpy(char* str1, char* str2);
Функция имеет два аргумента. Первый аргумент является строкой, в которую копируется содержимое второй строки. Исходное содержимое первой строки стирается. Второй аргумент может быть неименованной константой, первый обязательно должен быть адресом массива.
strncpy() – функция копирования заданного количества символов одной строки в другую. Её прототип имеет вид:
char* strncpy(char* str1, char* str2, int size);
Функция работает аналогично функции strcpy(), но копирует не более size символов. Отличие– не обязательно копирует завершающий нулевой символ строки str2. Например:
char * x = "1234567"; char y[25], z[10];
cout<<strcpy(y, x)<<endl; // y = 1234567
char * st = new char[25]; // динам. строка
cout<<strcpy(st, "ABC")<<endl; // ABC
strncpy(z, x, 5); z[5]='\0';
cout<<z<<endl; // z= 12345
strcat() – функция сложения двух строк. Её прототип имеет вид:
char * strcat(char* str1, char* str2);
Функция имеет два аргумента, первый аргумента является строкой, к которой добавляется содержимое второй строки. Первый символ (с индексом 0) str2 записывается поверх символа '\0' строки str1. Второй аргумент может быть неименованной константой, первый обязательно должен быть адресом массива. Функция возвращает указатель ( адрес) на начало сформированной строки str1.
strncat() – функция присоединения size символов одной строки к другой. Её прототип имеет вид:
char * strcat(char* str1, char* str2, int size);
Функция работает аналогично функции strcat(), но присоединяет к str1 size символов строки str2. Например:
char str1[20] = "ABC", *str2 = "*****", str3[20] = "1234";
strcat(str1, str2); cout<<str1<<endl; // str1 = ABC*****
strncat(str3, str2, 3); cout<<str3<<endl; // str3 = 1234***
strchr() – функция поиска символа в строке. Её прототип имеет вид:
char * strchr(char* str, char c);
Функция имеет два аргумента, первый является строкой, в которой выполняется поиск, второй – является символом, который ищется в строке. Функция возвращает адрес символа. Если символ не найден, функция возвращает NULL. Например:
char str[] = "11 + 22";
char *p; // объявляем указатель
p = strchr(str, '+'); // p указывает на подстроку "+ 22"
cout<<p<<endl; // + 22
strrchr() – функция определяет адрес последнего вхождения символа в строку, работает аналогично функции strchr(…);
strcmp() – функция сравнения двух строк. Её прототип имеет вид:
int strcmp(const char* str1, char* str2);
Функция имеет два аргумента – сравниваемые строки. Функция возвращает целое число, которое равно нулю, если строки равны, меньше нуля, если первая строка меньше второй и больше нуля, если первая строка больше второй.
strncmp() – функция сравнения заданного количества символов строк. Её прототип имеет вид:
int strcmp(const char* str1, char* str2, int size);
Функция работает аналогично функции strcmp(), но сравниваются size символов. Например:
char * s1 = "abc"; char * s2 = "Abc"; char *s3 = "Ab23";
cout<<strcmp(s1, s2)<<endl; // 1
cout<<strncmp(s2, s3, 2)<<endl; // 0
strstr() – функция поиска подстроки в строке. Её прототип имеет вид:
char * strstr(char* str, char* sub);
Функция имеет два аргумента, первый является строкой str, в которой выполняется поиск, второй sub – является подстрокой, которая ищется в строке. Функция возвращает адрес на первое вхождение подстроки sub. Причём поиск осуществляется, начиная с текущего адреса в строке. Если подстрока не найдена, то функция возвращает значение NULL.
// Пример 10.8. Определить, сколько раз подстрока встречается в строке.
#include <iostream>
#include <cstring>
using namespace std;
int main(){
int k = 0, n, len;
cout<<" Vvedi max dlinu stroki n: "; cin>>n;
char * str = new char[n];
cout<<"Vvedi stroku :"; fflush(stdin); gets(str);
char * sub="ab"; // подстроку можно и ввести
len = strlen(sub); // длина sub
char *q, *p = str;
while(1){
q = strstr(p, sub); // нахождение адреса подстроки sub
if(q != 0)k++; else break;
p = q + len; // р будет указывать на символ,
// след. после найденной подстроки
}
cout<<"k = "<<k<<endl;
system("pause");
}
// Пример 10.9. Ввести строку, добавить к ней "***"
// Определить длину полученной строки.
#include <iostream>
#include <cstring>
using namespace std;
int main(){
const int L = 50;
char str1[L], str2[] = "***";
cout<<"\nVvedi stroku:"; gets(str1);
strcat(str1, str2);
cout<<"str1 = "<<str1<<endl;
cout<<"dlina str1 = "<<strlen(str1)<<endl;
system("pause");
}
// ***Пример 10.10. Функция subStr() выделяет из строки s1, начиная
// с символа nach, kol символов. Функция delStr() удаляет из строки s,
// начиная с символа nach, kol символов.
#include <iostream>
#include <cstring>
using namespace std;
void subStr(char *s1, char *s2, int nach, int kol);
void delStr(char *s, int nach, int kol);
int main(){
int n; cout<<" Vvedi n: "; cin>>n;
char *str = new char[n];
if (!str){cout <<"No memory"; exit(1);}
char *sub = new char[10];
if (!sub){cout <<"No memory"; exit(1);}
cout<<"Vvedi stroku :"; fflush(stdin); gets(str);
cout<<"main: str== "<<str<<endl;
subStr(str, sub, 2, 3); // начиная с 3 символа, выделили 3 символа
cout<<"main: sub== "<<sub<<endl;
delStr(str, 1, 3); // начиная с 1 символа, удалили 3 символa
cout<<"main: str== "<<str<<endl;
delete [] str; delete [] sub;
system("pause");
}
void subStr(char *s1, char *s2, int nach, int kol){
char *p = s1; p = p + nach;
strncpy(s2, p, kol); s2[kol] = '\0';
}
void delStr(char *s, int nach, int kol){
char *p = s, *q;
p = p + nach; q = p + kol;
strcpy(p, q);
}
