[H-L-L.ru]

Форма входа

Меню сайта

Categories
1. Основы работы в среде C++ Builder.Основы языка Си++ [9]
2. Операторы ветвления и операторы передачи управления [4]
3. Операторы цикла и операторы передачи управления [5]
4. Одномерные массивы [3]
5. Многомерные массивы [3]
6. Указатели.Динамическое распределение памяти [6]
7. Отладка программы [3]
8. Функции [8]
9. Строки [5]
10. Функция Main [2]
11. Типы данных,определяемые пользователем [5]
12. Потоки ввода/вывода [7]
13. Основы объектно-ориентированного программирования [5]
Приложения [11]

Главная » Статьи » Лекции по C++ » 9. Строки

2. Операции со строками. Часть 1.
Ввод строк с клавиатуры

Можно использовать оператор 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;


Конкатенация (сцепление) строк

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

 

   char Str1[10],Str2[10],Str3[20],Str4[11]=", and \0";

   int I,J,K;

       printf("Input string: ");

       scanf("%s",Str1);

       printf("Input string too: ");

       scanf("%s",Str2);

       for (I=0;Str1[I]!=0;I++)

       Str3[I]=Str1[I];

       for (J=I,K=0;Str4[K]!=0;K++,J++)

       Str3[J]=Str4[K];

       for (I=J,K=0;Str2[K]!=0;K++,I++)

       Str3[I]=Str2[K];

       Str3[I]=0;

       printf("You input: %s\n",Str3);


 

Функция strcat() библиотеки string.h сцепляет строки точно также:

 

       char Str1[10],Str2[10],Str4[11]=", and \0";

       printf("Input string: ");

       scanf("%s",Str1);

       printf("Input string too: ");

       scanf("%s",Str2);

       strcat(Str1,Str4);

       strcat(Str1,Str2);

       printf("You input: %s\n",Str1);


 

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

 

       char Str1[100],Str2[10];

       printf(RUS("Введите строку: "));

       scanf("%s",Str1);

       printf(RUS("Введите еще строку: "));

       scanf("%s",Str2);

       RUS(", а затем \0");

       strcat(Str1,bufRus);

       strcat(Str1,Str2);

       printf(RUS("Вы ввели: %s\n"),Str1);

 

Функция strncat() также осуществляет конкатенацию строк, однако, присоединяет лишь указанное в третьем параметре количество символов (беззнаковое целое):

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

Функция возвращает указатель на начало сформированной строки strl.

Сравнение строк

Сравнение строк необходимо при поиске строк заданного содержания в тексте. В простейшем случае нужно сравнить 2 строки с начала до конца и ответить на вопрос равны они или нет. Приведенная ниже программа использует для этого цикл сравнения и логическую переменную PrEqu.

 

char Str[21];

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

int i=0;bool PrEqu=false; //i - счетчик букв

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

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

{if (Str[i]!=bufRus[i])

    {PrEqu=false;break;}//Если буквы не совпали выход из цикла

                                      // с отрицательным результатом PrEqu=false

i++;PrEqu=true;} //цикл сравнения

if (PrEqu) cout<<RUS("строки равны");

else cout<<RUS("строки не равны");


 

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

Функция strcmp () имеет синтаксис:

int strcmp(const char*  strl, const char*  str2)

После сравнения строк strl и str2 данная функция возвращает в результате одно из следующих значений:

• <0-еслистрока strl меньше, чем str2;

• =0 - если строки эквивалентны;

• >0 - если строка strl больше, чем str2. Эта функция производит сравнение, различая прописные и строчные буквы. Следующий пример иллюстрирует работу функции strcmp ():

char strl[]="Ошибка открытия базы";

char str2[]="Ошибка открытия Базы";

int i;

i = strcmp(strl, str2);


В результате переменной i будет присвоено положительное значение, так как строка из strl меньше, чем строка из str2, по той причине, что прописные буквы имеют код символов меньше, чем строчные (слово "базы " в первом случае начинается со строчной литеры, а во втором - с прописной).

Функция stricmp () имеет синтаксис:

int stricmp(const char*  strl, const char*  str2)

Данная функция сравнивает строки strl и str2, не различая регистра символов. Возвращается одно из следующих целочисленных значений:

• <0-еслистрока strl меньше, чем str2;

• =0 - если строки эквивалентны;

•  >0 - если строка strl больше, чем str2.

Следующий фрагмент программы демонстрирует применение функции stricmp ():

char strl[]="Moon";

char str2[]="MOON";

int i;

i = stricmp(strl,   str2);


В данном случае переменной i будет присвоено значение 0 (сигнализируя тем самым совпадение строк), так как strl и str2 отличаются только регистром.

Функция strncmp () проводит сравнение определенного числа первых символов двух строк. Регистр символов при этом учитывается. Функция имеет следующий прототип:

int strncmp(const char*  strl, const char*  str2, size_t num)

Данная функция сравнивает num первых символов двух строк, на которые указывают strl и str2, и возвращает одно из следующих значений:

• <0 - если строка strl меньше, чем str2;

• =0 - если строки эквивалентны;

•  >0 - если строка strl больше, чем str2.

Рассмотрим пример использования функции strncmp ().

char strl[]="Ошибка открытия базы";

char str2[]="Ошибка Открытия базы";

int i;

i = strncmp(strl, str2, 12);


В результате сравнения первых 12-ти символов обеих строк переменная i получит положительное значение, так как подстроки "Ошибка откры" и "Ошибка Откры" отличаются одним символом и в первом случае код символа больше, чем во втором.

Функция strnicmp () производит сравнение определенного числа первых символов двух строк, не обращая внимания на регистр символов. Данная функция описана следующим образом:

int strnicmp(const char*   strl, const char*   str2,   size_t num)

Функция возвращает целочисленное значение согласно правилу:

• <0 - если строка strl меньше, чем str2;

• =0 - если строки эквивалентны;

•  >0 - если строка strl больше, чем str2. В следующем примере производится сравнение заданного числа символов подстрок:

char strl[]="Opening error";

char str2[]="Opening Error...";

int i;


i = strnicmp(strl, str2, 13);

В результате переменной i будет присвоено значение 0, так как первые 13 символов обеих подстрок отличаются только регистром.


Источник: ввод строк с клавиатуры определение длины копирование конкатенация сравнение сцепление c++

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Полная версия сайта