Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр_2_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
217.09 Кб
Скачать

8. Строки

В языке Си++ отсутствует специальный строковый тип данных. Среди стандартных типов языка имеется символьный тип char. Переменная типа char предназначена для хранения кода отдельного символа, но не строки. Строковый тип есть только для неименованных констант, например: "Hello".

Стандартным способом хранения строк в программе является использование массивов типа char. Массив типа char- это последовательность индексированных переменных, в которых могут храниться символы. Для хранения строки используется массив, длина которого на одну переменную больше, чем количество символов в строке. Так для хранения строки "Hello", состоящей из пяти символов, будет использоваться массив из шести элементов. Это связано с тем, что строка всегда должна завершаться символом '\0' (конец строки). Пример объявления массива для хранения строки "Hello"с присваиванием ему начального значения:

char h[6]={'H','e','l','l','o','\0'};

Длина массива может быть больше требуемого размера, в этом случае остальные элементы массива просто не используются, но это дает возможность при необходимости помещать в массив более длинную строку.

Специально для строк допустим еще один способ инициализации массива в виде строковой константы:

char h[6]= "Hello";

Если массиву присваиваются при объявлении начальные значения, указывать размер массива в скобках не обязательно:

char h[]={'H','e','l','l','o','\0'};

char h[]="Hello";

Для ввода и вывода строки можно использовать операторы cin, cout языка Си++. Таким образом, чтобы вывести на экран содержимое массива Str типа char, можно записать:

cout << Str;

В случае ввода строки с помощью cin существуют серьезные ограничения. С помощью cin нельзя вводить строки, содержащие пробелы, так как cin воспринимает пробел при вводе как разделитель аргументов, после которого вводится другая переменная. Так, например, при вводе строки "language Си++" с помощью cin>> Str; в массив Str попадет только слово "language".

В данном случае, следует пользоваться функцией gets(Str);

При передаче строки в функцию, передается адрес ее начала, который, по сути, является адресом начала массива. Причем это справедливо не только для строк, содержащихся в массивах, но и для неименованных строковых констант. Если такая константа передается в качестве аргумента функции, в функцию передается адрес ее начала. Например:

cout<<"Hello world!";

Так как строки представляют собой массивы, операции присваивания, сложения и т. д. над строками не допустимы. Например, следующая конструкция является недопустимой:

char Str[10];

Str = "Hello"; // Недопустимо такое присваивание

char Str1[10], Str2[10]="ffff";

Str1=Str2; // Недопустимо и такое присваивание

Для операций со строками используются функции стандартной библиотеки, находящиеся в заголовочном файле string.h. Наиболее часто используемыми из них являются функции:

.strcpy() - функция для копирования одной строки в другую. Ее прототип имеет вид:

char *strcpy(char* str1, const char* str2);

Функция имеет два аргумента, первый аргумент является строкой, в которую копируется содержимое второй строки. Исходное содержимое первой строки стирается. Второй аргумент может быть неименованной константой, первый обязательно должен быть адресом массива. Например, char Str1[10], Str2[]="abcd", Str3[5];

strcpy(Str1, Str2);

strcpy(Str3, "1234");

.strncpy() - функция для копирования заданного количества символов второй строки в первую. Ее прототип имеет вид:

char *strncpy(char* str1, const char* str2, int size);

Функция имеет два аргумента, первый аргумент является строкой, в которую копируется size символов второй строки. Второй аргумент может быть неименованной константой, первый обязательно должен быть адресом массива.

.strcat()- функция сложения двух строк. Ее прототип имеет вид:

char * strcat(char* str1, const char* str2);

Функция имеет два аргумента, первый аргумент является строкой, к которой добавляется содержимое второй строки. В результате в первой строке будет находиться результат сложения двух строк. Второй аргумент может быть неименованной константой, первый обязательно должен быть адресом массива.

.strchr() - функция для поиска символа в строке. Ее прототип имеет вид:

char * strchr(const char* str, int c);

Функция имеет два аргумента, первый является строкой, в которой выполняется поиск, второй - является символом, который ищется в строке. Результатом функции является целое число, содержащее номер найденного символа;

.strcmp()- функция сравнения двух строк. Ее прототип имеет вид:

int strcmp(const char* str1, const char* str2);

Функция имеет два аргумента: сравниваемые строки. Результатом функции является целое число, которое равно нулю, если строки равны, меньше нуля, если первая строка меньше второй и больше нуля, если первая строка больше второй;

.stricmp()- функция сравнения двух строк, не делая различия между буквами верхнего и нижнего регистров. Ее прототип имеет вид:

int stricmp(const char* str1, const char* str2);

Функция имеет два аргумента: сравниваемые строки. Результатом функции является целое число, которое равно нулю, если строки равны, меньше нуля, если первая строка меньше второй и больше нуля, если первая строка больше второй;

.strlen()- функция вычисления длины строки. Ее прототип имеет вид:

unsigned strlen(const char* str);

Функция имеет один аргумент: строку, чья длинна вычисляется. Возвращаемое значение является целым числом, величина которого равна длине строки без учета завершающего нулевого символа.

.strspn()- функция просматривает строку str и возвращает количество идущих подряд символов, содержащихся в строке pat. Ее прототип имеет вид:

unsigned strspn(const char* str, const char* pat );

Функция имеет два аргумента.

.strcspn()- функция просматривает строку str и возвращает количество подряд идущих символов, которых нет в строке pat. Ее прототип имеет вид:

unsigned strсspn(const char* str, const char* pat );

Функция имеет два аргумента.

Например:

#include <stdlib.h>

#include <string.h>

#include <iostream.h>

int main()

{

char pat [6]="., !?";

char Str[]="111, 22222. 55555?";

char *p=Str;

cout<<"1=="<<endl;

p=p+strspn(p,pat);

cout<<p<<endl;

int Len=strcspn(p,pat);

cout<<"Len="<<Len<<endl;

p+=Len;

cout<<p<<endl;

cout<<"2=="<<endl;

p=p+strspn(p,pat);

cout<<p<<endl;

Len=strcspn(p,pat);

cout<<"Len="<<Len<<endl;

p+=Len;

cout<<p<<endl;

cout<<"3=="<<endl;

p=p+strspn(p,pat);

cout<<p<<endl;

Len=strcspn(p,pat);

cout<<"Len="<<Len<<endl;

p+=Len;

cout<<p<<endl;

system("pause");

return 0;

}

Результат работы программы:

1==

111, 22222. 55555?

Len=3

, 22222. 55555?

2==

22222. 55555?

Len=5

. 55555?

3==

55555?

Len=5

?

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

char * poisk(char * str,char c);

main()

{

char str[10];

cout<<"Vvedi stroky :";

gets(str);

cout<<"str="<<str <<endl;

cout<<"strlen="<<strlen(str)<<endl;

cout<<*str<<"---"<<str+2<<"---"<<*(str+2)<<endl<<endl;

strcat(str,"adg");

cout<<"strcat"<<str<<endl;

getch();

char s1[]="01234567",*s2,*s3;

s2=s1+6;

s3=s2-2;

cout<<"strcmp="<<strcmp(s1,s2-1)<<endl;

cout<<"stricmp="<<stricmp(s1,s2-1)<<endl;

cout<<"strncmp="<<strncmp(s3+2,s1+5,2)<<endl;

s3= strstr(s1,"45");

cout<<"strstr="<<s3<<'\n';

cout<<"strchr="<<strchr(s1,'2')<<endl;

getch();

char *pp="0123456789";

cout<<"pp="<<pp<<' '<<(char)pp[0]<<' '<<pp[1]

<<' '<<(int)pp[7]<<endl;

char s[]="5551228",*p=s;

strcpy(pp,p);

cout<<"strcpy="<<pp <<endl;

strcpy(pp,"*****");

cout<< "strcpy="<<pp<<endl;

strncpy(pp,s+1,3);

cout<< "strncpy="<<pp<<endl;

strncpy(pp,s+2,2);

cout<< "strncpy="<<pp<<endl;

pp[3]='\0';

cout<< "pp="<< pp<<endl<<endl;

getch();

char *st,c;

st=new char[10];

cout<<"Vvedi stroky :";

cin>>st;

cout<<"Vvedi simvol:";

cin>>c;

char * str2;

str2=poisk(st,c);

if(str2)cout<<"str2="<<str2<<endl;

else cout<<"No"<<endl;

delete []st;

getch();

char pat [6]=", .!?";

char Str[]="111, absda. 55555?";

char *uk=Str;

cout<<"1=="<<endl;

uk=uk+strspn(uk,pat);

cout<<uk<<endl;

int Len=strcspn(uk,pat);

cout<<"Len="<<Len<<endl;

uk+=Len;

cout<<uk<<endl;

cout<<"2=="<<endl;

uk=uk+strspn(uk,pat);

cout<<uk<<endl;

Len=strcspn(uk,pat);

cout<<"Len="<<Len<<endl;

uk+=Len;

cout<<uk<<endl;

cout<<"3=="<<endl;

uk=uk+strspn(uk,pat);

cout<<uk<<endl;

Len=strcspn(uk,pat);

cout<<"Len="<<Len<<endl;

uk+=Len;

cout<<uk<<endl;

getch();

}

char * poisk(char * str,char c)

{ int i=0;

while (str[i])

{ if( str[i]==c) return str+i;

i++;

}

return NULL;

}

Пример 8.1. Программа вводит текст, добавляет его к строке "***" и определяет длину полученной строки.

#include <iostream.h>

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

int LengthString(char *);

int main()

{

const int L = 256;

char Str1[L] = "***", Str2[L];

cout << "\nВведите строку:";

gets(Str2);

strcat(Str1,Str2);

cout << "\nПолученная строка:" << endl;

cout << Str1 << endl;

cout << "\nДлина строки (фукнция пользователя):";

cout << LengthString(Str1) << endl;

cout << "\nДлина строки (функция компилятора C++):";

cout << strlen(Str1) << endl;

system("pause");

return 0;

}

int LengthString(char *Str)

{

int i = 0;

while(Str[i])

i++;

return i;

}

Пример 8.2. Программа вводит текст (без пробелов) и преобразует его к верхнему регистру.

#include <iostream.h>

#include <stdlib.h>

void UpperLetters(char *);

int main()

{

const int L = 256;

char Str[L] ;

cout << "\nВведите строку:";

cin>> Str;

cout << "\nИсходная строка:" << Str << endl;

UpperLetters(Str);

cout << "\nПолученная строка:" << Str << endl;

system("pause");

return 0;

}

void UpperLetters(char *Str)

{

int i = 0;

while(Str[i])

{

if ( Str[i] >= 'a' && Str[i] <= 'z' )

Str[i] = Str[i] -32;

i++;

}

}

Пример 8.3. Дан массив из слов длиной не более 20-ти символов. Отсортировать массив в алфавитном порядке методом "пузырька".

Текст программы.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <iostream.h>

void Sort(char MasWord[][20], int Size);

int main()

{

const int N = 5;

const int L = 20;

char MasWords[N][L];

cout << "\nВведите массив слов\n";

for(int i = 0; i < N; i++)

cin>>MasWords[i];

cout << "\n\tМассив из слов\n";

for(int i = 0; i < N; i++)

cout << (i + 1) << " . " << MasWords[i] << endl;

Sort(MasWords, N);

cout << "\n\tМассив слов, отсортированный по алфавиту\n";

for(int i = 0; i < N; i++)

cout << (i + 1) << " . " << MasWords[i] << endl;

system("pause");

return 0;

}

void Sort(char MasWords[][20], int N)

{

for(int i = 0; i < N; i++)

for(int j = N - 1; j > i; j--)

if (stricmp(MasWords[j],MasWords[j-1])<0)

{

char Str[256] ;

strcpy(Str,MasWords [j]);

strcpy(MasWords[j],MasWords[j-1]);

strcpy(MasWords[j-1],Str);

}

}

Пример 8.4. Текст, в котором слова разделяются произвольным количеством пробелов, разбить на отдельные слова.

Текст программы.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <iostream.h>

int main()

{

char Str[256];

char Str1[]=",. "; //Строка символов-разделителей слов в тексте

const int N = 20;

const int L = 10;

char MasWords[N][L]; //Массив для будущих слов

cout << "\nВведите текст:\n";

gets(Str);

int k=0;

char *p1=Str;

do

{

p1+=strspn(p1,Str1); //В р1 адрес начала слова

int Len=strcspn(p1,Str1); //Len- длина слова

strncpy(MasWords[k],p1,Len); //Копируем Len символов(очередное слово)

MasWords[k][Len]='\0'; //Заканчиваем слово символом конца строки (\0)

k++;

p1+=Len;

}

while(*p1);

cout << "\n\tМассив слов:\n";

for(int i = 0; i < k; i++)

cout <<MasWords[i] << endl;

system("pause");

return 0;

}