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

Void main()

{

const int len=80;

char st[len];

cin<<st; // строку можно вводить и

cout<<st<<endl;// выводить “целиком”

}

Проблема при вводе строк возникнет, если мы попытаемся ввести строку, состоящую из нескольких слов. Так как ввод выполняется до первого пробела, знака табуляции или символа конца строки ( \n ), то вместо двух (нескольких слов) будет введено только первое слово. Решение проблемы – воспользоваться методом getline:

#include <iostream.h>

Void main()

{ const int len=80;

char st[len];

cin.getline(st,len); //вводим строку длиной len-1,если раньше не

//встретится символ \n

cout<<st<<endl;

}

Аналогичным образом строка символов вводится из текстового файла, при этом символ перевода строки - \n в строку не копируется.

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

Так, функция strlen рассчитывает длину строки, а функции strcpy и strncpy – копируют символы строки в другую строку.

#include <iostream.h>

#include <string.h>

Void main()

{

char st[80];

cin.getline(st,80);//вводим строку

int m=strlen(st);// определяем длину строки без нуль-символа

char* pst =new char [m];// создаем динамический массив

strcpy(pst,st); // копируем строку st в pst

cout<<pst<<endl;

}

Функция strcpy копирует все символы строки st в pst, включая нуль-символ.

Другая функция копирования strncpy(pst,st,m) – копирует не более m символов. Если нуль-символ в исходной строке встречается раньше, копирование прекращается, оставшееся место в строке pst заполняется нуль-символами. Если m меньше или равно длине строки st, завершающий нуль-символ в pst не добавляется. Объединить строки можно функцией strncat(st1,st2,n). Функция добавляет не более n символов строки st2 к строке st1. При использовании этой функции следует контролировать границы строковых массивов.

Среди большого количества строковых функций выделим также функцию strrchr(st,ch) – она определяет первое вхождение символа ch в строку st справа, или возвращает значение false в противном случае. И функцию strstr(st,st2), которая определяет, входит ли строка st2 в строку st. Если совпадения символов нет, то возвращается значение false, в противном случае – выводится строка st2.

Следующий листинг демонстрирует работу этой функции:

#include <fstream.h>

#include <string.h>

Void main()

{

fstream f("a.txt",ios::in||ios::nocreate);

char st[80],st2[]="test";

while(!f.eof())

{

f.getline(st,80);//вводим строку

If(strstr(st,st2)) //если подстрока встречается, выводим

cout<<strstr(st,st2)<<endl;

}

}

3.1.5. Динамическое определение одномерных массивов.

До сих пор мы рассматривали примеры определения массивов, в которых память под массивы резервировалась во время компиляции.

  • Распределение памяти для массива во время компиляции называется статическим связыванием.

Предположим, что создается программа, в которой массив может потребоваться, а может - нет, в зависимости от хода выполнения программы. При обычном подходе массив создается путем объявления. Память под него, независимо от использования массива, будет отведена на этапе компиляции, что не очень рационально.

В С++ реализована и другая возможность распределения памяти - непосредственно во время выполнения программы с помощью оператора new.

  • Распределение памяти для массива во время выполнения программы называется динамическим связыванием.

// пример динамического создания одномерного массива

i = 10; // в ходе выполнения программы определена размерность массива

double * mass = new double [i];// определен динамический массив mass[10]

После окончания работы с массивом следует освободить память с помощью оператора delete :

delete [] mass;

Следующие правила помогут вам избежать ошибок при использовании операторов new и delete:

  • Не используйте delete для высвобождения памяти, которую не распределяли с помощью new.

  • Не используйте delete для освобождения одного и того же блока памяти несколько раз.

  • Используйте оператор delete [], если был применен оператор new [] для распределения массива.

  • Если для освобождения памяти воспользоваться оператором delete вместо delete[], то буден освобожден только первый элемент массива, а остальная память освобождена не будет и окажется недоступной! Такие ячейки памяти называют «мусором».

  • Используйте оператор delete (без квадратных скобок), если был применен оператор new для распределения одного элемента.

  • Из последнего пункта следует, что оператор new можно применять для выделения памяти и под простые переменные, но необходимость в этом возникает гораздо реже.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]