Библиотечные функции обработки строк
Операции над строками
Для строк не определена операция присваивания,
поскольку строка является не основным типом данных,
а массивом.
1) strcpy()
2) strncpy()
Формат strcpy(to, from)- копирует содержимое строки from в строку to.
to по длине не меньше from.
Присваивание выполняется с помощью функций стандарной библиотеки
или посимвольно "вручную" (что менее предпочтительно,
так как чревато ошибками)
Например, чтобы присвоить строке to строку from, можно воспользоваться функциями strcpy или strncpy:
Функция strcpy(to,from) копирует все символы строки,
yказанной вторым параметром (from), включая завершающий 0, в строку, указанную первым параметром (to).
Функция strncpy(to,from,n) выполняет то же самое, но не более n символов, то есть числа символов ,указанного третим параметром. Если нуль-символ в исходной строке встртится раньше, копирование прекращается, а оставшиеся до n символы строки to заполняются нуль-символами. В противном случае (если n меньше или равно длине строки from) завершающий нуль-символ в to не добавляется.
Обе эти функции возвращают указатель на результирующую строку. Если области памяти , занимаемой строкой-назначением и строкой-источником, перекрываются, поведение программы не определено.
3) strcat()
Формат strcat(s1, s2)-присоединяет строку s2 к концу строки s1.
Примечание строка s2 не меняется.
4) strcmp()
Формат strcmp (s1, s2)- сравнивает s1 с s2( лексико-графический)
s1 =s2 функция возвращает 0
s1 >s2 функция возвращает положительное значение
s1 <s2 функция возвращает отрицательное значение
5) strclen()
strclen(s) – возвращает количество символов , не считая
Программист должен сам заботиться о том , чтобы в строке-приемнике хватило места для строки-источника ( в данном случае при выделении памяти значение переменной m должно быть больше или равно 100), и о том, чтобы строка всегда имела завершающий нуль-символ.
____________________________________________
Внимание
Выход за границы строки и отсутствие нуль-символа являются распространенными прчинами ошибок в программах обработки строк.
**************************************************
// Never trouble trouble, till trouble troubles you
// Никогда не беспокойте проблему , пока проблема не //беспокоит Вас
//arb2009_stroka6_1
#include<iostream.h>
#include<string.h>
void main()
{
int m;
char a[100] = "Never trouble trouble";
cout<<"Enter length of string m= ";
cin>>m;
char *p = new char[m];
strcpy(p,a);
cout<<"String p= "<<p<<endl;
char b[100] = "Good day!";
strncpy(p,b,strlen(b)+1);
cout<<"String b= "<<b<<endl;
}
****************************************************
Если задать m=20, то напечатается
"Never trouble trouble" и
"Good day!" и нет никаких сообщений
Если задать m=3, то напечатается
"Never trouble trouble" и
"Good day!" и
сообщения об ошибке и "приложение будет закрыто"
хотя под строку p было выделено 3 байта
*************************************************
// Never trouble trouble, till trouble troubles you
//Никогда не беспокойте проблему, пока проблема не //беспокоит Вас
//arb2014_basic_functions
#include<iostream.h>
#include<string.h>
void main()
{
int m;
char a[100] = "Never trouble trouble";
cout<<"Enter length of string m= ";
cin>>m;
char *p= new char[m];
strcpy(p,a);
cout<<"length p="<<strlen(p)<<endl;
cout<<"String p= "<<p<<endl;
char b[100] = "Good day!";
strncpy(p,b,strlen(b)+1));
cout<<"String p= "<<p<<endl;
}
Комментарии.
Введем m=30 и m=3 для первой функции
strcpy(p,a);
cout<<"length p="<<strlen(p)<<endl;
//длина всегда 30 (?)
//arb2009_stroka5_1
#include<iostream.h>
#include<string.h>
void main()
{
char a[100] = "Never trouble trouble";
int m;
cout<<"Enter length of string m= ";
cin>>m;
char *p = new char[m];
char *q = new char [m];
strcpy(p,a);
cout<<"String p= "<<p<<endl;
char b[100] = "Good day!";
strncpy(p,b,3);
cout<<"String p= "<<p<<endl;
strncpy(q,b,3);
cout<<"String q= "<<q<<endl;
}
**********************************************
Если введем m=3
оператор:
strcpy(p,a);
cout<<"String p= "<<p<<endl;
результат:
String p= Never trouble trouble;
операторы:
char b[100] = "Good day!";
strncpy(p,b,3);
cout<<"String p= "<<p<<endl
результат:
String p= Gooer trouble trouble;
операторы
strncpy(q,b,strlen(b)+1);
cout<<"String q= "<<q<<endl;
результат
String p= "Good day!";
и сообщение об ошибке
Если введем m=10
Все тоже самое, но нет сообщения об ошибке
Указатель p адресует память, в которую скопировали
строку "Never trouble trouble".
Теперь туда же снова копируем новую строку
"Good day!", но только из этой строки берем 3 символа
Поскольку в этих 3 символах не встречается нуль-символ,то печать строки продолжается до нуль-символа , который был поставлен первый раз.
Будет напечатано Gooer trouble trouble
p |.|------->| Never trouble trouble\0 |
Nev заменяется Goo
p |.|------->| Gooer trouble trouble\0 |
**************************************************
Функции преобразования
Для преобразования строки в целое число используется функция atoi(str).Функция преобразует строку, содержащую символьное представление целого числа, в соответствующее целое число.
Признаком конца числа служит первый символ, который не может быть интерпретирован как принадлежащий числу.
Если преобразование не удалось возвращает 0.
Аналогичные функции преобразования строки в длинное целое число (long) и в вещественное число с двойной точностью (double) называются atol и atof соответственно.
Пример
//arb2009_stroka7_1
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
void main()
{
char a[]= "10) Height-162sm, weight-59.55 kg";
int num;
long height;
double weight;
num = atoi(a);
height = atol(&a[11]);
weight = atof(&a[25]);
cout<<num<<' '<<height<<' '<<weight<<endl;
}
Печатает 10 162 59.55
Демонстрация функций
Программа 1
//arb2014_demostr_functions_Cstring
#include <iostream.h>
#include <string>
#include <ctype.h>
using namespace std;
void main()
{
char s1[30], s2[30];
strcpy(s1,"C++");
strcpy(s2," is power language!");
cout<<"Length of string s1="<<strlen(s1)<<endl;
cout<<"Length of string s2="<<strlen(s2)<<endl;
if (!strcmp(s1,s2)) cout<<"This strings are equals"<<endl;
else cout<<"This strings are not equals"<<endl;
strcat(s1,s2);
cout<<"s1= strcat(s1,s2); s1= "<<s1<<endl;
strcpy(s2,s1);
cout<<"s2=strcpy(s2,s1) s2="<<s2<<endl;
if (!strcmp(s1,s2)) cout<<"This strings are equals"<<endl;
else cout<<"This strings are not equals"<<endl;
cout<<"enter s1=";
cin>>s1;
s1[0]='A';
cout<<"s1[0]='A' s1= "<<s1<<endl;
int i;
for (i=0;s1[i];i++)
s1[i]= toupper(s1[i]);
cout<<"Upper s1="<<s1<<endl;
for (i=0;s1[i];i++)
s1[i]= tolower(s1[i]);
cout<<"Lower s1="<<s1<<endl;
}
Программа 2