Краткие теоретические сведения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Краткие теоретические сведения



 

Строки

 

Массив переменных символьного типа (char) образует строку. Существует ряд особенностей работы с массивами этого типа. Например, инициализация строк осуществляется с помощью строковых констант:

 

char Str1[20];//Строка в 20 символов

char Junuary[]="Junuary \0";//инициализация строкового массива

 

В отличие от других типов данных, массив char может использоваться без указания индекса. В связи с этим массив имеет скрытую структуру. В конце массива компилятор языка С++ иногда устанавливает символ 0 (байт равный нулю). Например, это делает функция ввода scanf. Ноль позволяет определять конец строки при ее использовании. Иногда 0 нужно установить программисту. Например, при инициализации строки.

В русском тексте строки русскоязычные. Для введения русскоязычных строк используется функция RUS. Рассмотрим ее подробнее:

 

// функция поддержки русского языка в консольном приложении

char bufRus[256]; //глобальная переменная bufRus используется

                           // в функции RUS

//---------------------------------------------------------------------------

char* RUS(const char* text) //заголовок функции

{

CharToOem(text,bufRus); //тело функции

return bufRus;        //

}

 

Особенность функции состоит в использовании указателей. Аргумент и возвращаемое значение функции имеют тип char*, т. е. адрес строки символов. Следовательно, можно получить адрес строки, а сама строка находится в массиве bufRus, именно его адрес и возвращается функцией. Поэтому можно и прямо обращаться к массиву bufRus, после того как с помощью функции RUS его содержимое заполнится русскоязычной строкой. Приведенная ниже программа печатает массив bufRus побуквенно:

 

char Str[21];

int i=0;//i – счетчик букв

RUS("Проверка");//Занесение русского текста в bufRus

while (bufRus[i]!='\0') //Проверка на конец копируемого массива

{cout<<bufRus[i];i++;} //цикл побуквенной печати

 

Ввод строк с клавиатуры

 

Можно использовать оператор cin. Операция ввода записывается как:

cin>>St;

При использовании оператора cin необходимо учитывать следующее:

- Ввод заканчивается после нажатия клавиши Enter;

- Если в строке есть пробел, то символы после пробела не вводятся;

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

- Если количество введенных символов больше объявленной длины строки, то вводятся все символы до нажатия клавиши Enter.

В качестве оператора ввода при работе со строками вместо оператора записи в поток cin>> лучше использовать функцию cin.getline(), так как потоковый оператор ввода игнорирует вводимые пробелы, а кроме того, может продолжить ввод элементов за пределами массива, если под строку отводится меньше места, чем вводится символов. Функция cin.getline() принимает два параметра: первый аргумент указывает на строку, в которую осуществляется ввод, а второй - число символов, подлежащих вводу.

Рассмотрим пример объявления символьных строк и использования функции ввода cin.getline ().

 

char myString[4];

cout << RUS("Введите строку из 3 символов") << '\n';

cin.getline(myString, 4);

cout << RUS("Вы ввели: ") << myString;

 

Объявленная в начале программы строка myString может принять только три значащих символа и будет завершена нуль-терминатором. Все последующие символы, вводимые в этот строковый массив, будут отброшены. Как видно из примера, при использовании функции cin.getline () вторым параметром следует указывать число, меньше или равное размеру вводимой символьной строки.

Иногда более удобен ввод с помощью функции gets().

При использовании функции gets() необходимо учитывать следующее:

- Вводятся пробелы;

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

- Количество введенных символов не должно быть больше объявленной длины строки (функция gets не контролирует количество символов, и это может привести к непредсказуемой ошибке);

- Ввод заканчивается после нажатия клавиши Enter.

 

char myString[4];

cout << RUS("Введите строку из 3 символов") << '\n';

gets(myString);

cout << RUS("Вы ввели: ") << myString;

 

Определение длины строк

 

Очень часто при работе со строками необходимо знать, сколько символов содержит строка. Для выяснения информации о длине строки в заголовочном файле string.h описана функция strlen(). Синтаксис этой функции имеет вид:

size_t strlen(const char* string)

Данная функция в качестве единственного параметра принимает указатель на начало строки string, вычисляет количество символов строки и возвращает полученное беззнаковое целое число (size_t). Функция strlen () возвращает значение на единицу меньше, чем отводится под массив по причине резервирования места для символа ' \0'. Следующий фрагмент демонстрирует использование функции strlen ():

 

char Str[] = "ABCDEFGHIJK";

unsigned int i;

i = strlen(Str);

 

Часто функция sizeof () используется при вводе строк в качестве второго параметра конструкции cin.getline (), что делает код более универсальным, так как не требуется явного указания числа вводимых символов. Если теперь потребуется изменить размер символьного массива, достаточно модифицировать лишь одно число при объявлении строки символов:

// Было:

char myString[4];

cin.getline(myString, 4);

// Стало:

char myString[20];

cin.getline(myString, sizeof(myString))

 

Копирование строк

 

Значения строк могут копироваться из одной в другую. Процедура идентична копированию массива. Например, в приведенной ниже программе содержимое строки bufRus копируется в строку Str. Копирование прекращается в случае достижения нуль-терминатора (‘\0’) строки bufRus, поэтому перед копированием необходимо удостовериться, что длина bufRus меньше или равна длине Str. В противном случае возможно возникновение ошибок.

 

char Str[21];

int i=0;//i – счетчик букв

RUS("Проверка копирования");//Занесение русского текста в bufRus

while (bufRus[i]!='\0') //Проверка на конец копируемого массива

{Str[i]=bufRus[i];i++;} //цикл копирования

cout<<Str;

 

В библиотеке string.h для копирования используют ряд стандартных функций.

Функция strcpy () имеет прототип:

char* strcpy(char* strl, const char* str2)

и выполняет побайтное копирование символов из строки, на которую указывает str2, в строку по указателю strl.

Например, следующий фрагмент копирует в строку Str значение строки "Проверка копирования":

char Str[21];

strcpy(Str, RUS("Проверка копирования"));

Можно производить копирование не всей строки, а лишь отдельного ее фрагмента (до конца строки). При этом второй параметр является указателем на некоторый элемент строкового массива. Например, следующий фрагмент скопирует в str2 окончание строки Str:

 

char Str[21],str2[21];

strcpy(Str, RUS("Проверка копирования"));

char* ptr = Str;

ptr += 9;

// ptr теперь указывает на

// подстроку "копирования"

//в строке Str

strcpy(str2, ptr);

cout << str2;

 

При выполнении программы будет выведен текст: копирования.

Функция strncpy () отличается от strcpy () тем, что в ее параметрах добавляется еще один аргумент, указывающий количество символов, не больше которого будет скопировано. Ее синтаксис имеет вид:

char* strncpy(char* strl, const char* str2, size_t num)

Если длина strl меньше длины str2, происходит урезание символов:

 

char cLong[] = "012345678901234567890123456789";

char cShort[]="abcdef";

strncpy(cShort, cLong, 4);

cout << cShort <<'\n';

cout << cLong <<'\n';

 

В результате будет выведено:

 

0123ef

012345678901234567890123456789

 

То есть из строки cLong в строку cShort скопировано четыре первых символа, заменив, тем самым, исходное значение начала короткой строки.

Функция strdup () в качестве параметра получает указатель на строку-источник, осуществляет распределение памяти, копирует в отведенную область строку и возвращает указатель на начало полученной строки-копии. Синтаксис функции следующий:

char* strdup(const char* source)

В следующем примере производится копирование строки strl в строку str2:

char* str1;

str1=new char[21];//динамическое выделение памяти

strcpy(str1, RUS("Процедура не найдена"));

char* str2;

str2 = strdup(str1);

cout<<str2;

delete[]str1;

 



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 67; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.197.201 (0.011 с.)