
- •Массивы
- •Указатели
- •Указатели и массивы
- •Арифметические операции над указателями
- •1. Одномерный массив
- •2. Двумерный массив
- •3. Использование дополнительного указателя
- •Динамическое распределение памяти
- •2. Одномерный массив
- •Выделение и освобождение памяти в стиле c
- •2 Освобождение памяти
- •Утечка памяти
- •Исползование ключевого слова const при объявлении указателей
- •Указатели и строки
- •Инициализация строки
- •Ввод строк в консольном приложении
- •Функции для работы со строками
- •Основные манипуляции со строками
- •Некоторые замечания по работе со строками
Основные манипуляции со строками
#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");
}
При динамическом выделении памяти под строку новую переменную необходимо заполнить нулями \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 может быть выдано предупреждение компилятора.
Пример :Найти ошибку!
i { 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; } |