Библиотечные функции обработки строк

 

Операции над строками

Для строк не определена операция присваивания,

поскольку строка является не основным типом данных,

а массивом.

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