Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++ / L_4.doc
Скачиваний:
105
Добавлен:
02.04.2015
Размер:
120.83 Кб
Скачать

Основные манипуляции со строками

#include <iostream>

#include <string>

using namespace std;

int main()

{

string str1("HELP");// объявление и инициализация с

string str2("ABCDEF");// помощью конструктора

str1.insert(3,str2); //вставка строки str2 в 3-ю позицию строки

// str1;нумерация начинается с 0

cout<<str1<<endl; // “HELABCDEFP”

str1.erase(3,6); // Удаление 6 символов из строки str1, начиная с

// 3-ей позиции

cout<<str1<<endl; // “HELP”

str1.replace(1,2,str2); // Замена 2-х символов в str1 строкой str2,

// начиная с позиции 1.

cout<<str1<<endl; // “HABCDEFP”

int i;

str1="Class string in C++";

i=str1.find("string");// поиск строки string в строке str1

// Если поиск успешен- возвращается позиция , в которой обнаружено

// совпадение, в противном случае значение npos

if (i!=string::npos) // в классе string определена константа

//npos=-1.

{

cout<<"sovpadenie v position "<<i<<endl; //6

}

system("pause");

return 0;

}

Некоторые замечания по работе со строками

1.Пусть задан массив символов сhar input[80];

Требуется ввести с консоли в этот массив строку.

Функция gets( ) не контролирует размер переменной input и размер вводимой строки. Это может привести к переполнению буфера input и затиранию соседних участков памяти.

Вместо функции gets( ) следует применять функцию fgets( ), которая используется при работе с файлами, но указывать стандартный поток stdin.

Пример: Подсчитать число символов во введенной строке без учета \0.

#include <cstdio>

#include <iostream>

using namespace std;

int main()

{

char input[6];

int number=0;

cout<<"Input string: ";

fgets(input,6,stdin); // 6- размер буфера

// Функция fgets( ) читает (6-1) символов и записывает их в input

// Отсутствует атака переполнения буфера

while(input[number++]); // цикл заканчивается, когда найден \0

cout<<"\nNumber of symbols "<<number-1<<endl;

cout<<input<<endl;

system("pause");

}

  1. При динамическом выделении памяти под строку новую переменную необходимо заполнить нулями \0 в цикле for. Цикл while для этого не подходит, т.к. выделенная область памяти содержит мусор и может иметь нулевые символы, что приведет к тому, что строка заполнится нулями не до конца.

Пример: Создание строки в динамической области памяти и копирование исходной строки в начало созданной

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

char *a="1111";

char *b;

unsigned int number, i;

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

cin>>number;

if (number>4 && number<=81)

{

b=new char[number];// выделение памяти подстроку b

b[number-1]='\0';// завершение строки нулевым байтом

for (i=0;i<number-1;i++) b[i]='\0';// заполнение новой строки нулями

for (i=0;i<strlen(a);i++) b[i]=a[i]; // копирование содержимого строки

// a в начало строки b

cout<<b<<endl;

delete [] b;

}

system("pause");

return 0;

}

Замечание: если в цикле описать int i, то при сравнении со значением функции strlen может быть выдано предупреждение компилятора.

Пример :Найти ошибку!

int main(int argc, char* argv[])

{

int var, *ptr;

var=10;

*ptr=var;

cout<<*ptr<<endl;

system("pause");

return 0;

}

int main(int argc, char* argv[])

{

int var, *ptr;

var=10;

ptr=new int;

*ptr=var;

cout<<*ptr<<endl;

delete ptr;

system("pause");

return 0;

}

Соседние файлы в папке c++