Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

4.3 Демонстрационные программы

Рассмотрим одну простую программу, которая сравнивает три строки.

#include <string.h>

#include <iostream.h>

int main(void)

{

char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";/*объявили

* указатели символьных массивов

* и инициализировали их*/

int ptr;

ptr = strcmp(buf2, buf1);

if (ptr > 0)

cout<<("buffer 2 is greater than buffer 1\n");

else

cout<<("buffer 2 is less than buffer 1\n");

ptr = strcmp(buf2, buf3);

if (ptr > 0)

cout<<("buffer 2 is greater than buffer 3\n");

else

cout<<("buffer 2 is less than buffer 3\n");

return 0;

}

4.10. Класс string

Стандартом ANSI C++ предусмотрена специальная библиотека string. Эта библиотека состоит из одного класса string, в который входят более ста функций членов. Некоторые из этих функций выполняют операции со строками значительно эффективнее, чемфункции, которые мы привели ранее в таблице. Например, для копирования одной строки в другую используется оператор =, а для объединения (конкатинации) строк оператор +. В качестве иллюстрации приведем маленькую программу.

#include <iostream>

#include <string> //требуется для работы с классом string

using namespace std;

int main()

{

string s1="Hellow", s2="my friend!", s3;

s3=s1+s2;

cout<<s3;

}

В результате выполнения программы на экране появится строка:

Hellowmy friend!

Обратите внимание – операция конкатинации не вносит дополнительных пробелов, поэтому слова Hellow и my записаны слитно.

Класс string исключает проблемы со строками, которые возможны при использовании библиотеки stdlib.

В классе string есть несколько конструкторов. По умолчанию объект типа string инициализируется пустой строкой. Кроме того есть конструктор с одним аргументом, являющимся стандартной С строкой. Чтобы действительно понять, что сказано в этом абзаце обратимся к рассмотренному выше примеру, но при этом немного модернизируем его.

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s1,s3; //инициализация пустой строкой

s1="Hellow";

string s2(" my friend!");//инициализация строкой

s3=s1+s2;

cout<<s3;

}

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

Функция-член

Описание

Конструкторы

string str;

Конструктор по умолчанию. Создает объект пустой строки, т.е. в объекте str ничего не записано.

string str("string");

Создает объект класса string со значением "string"

string str(aString);

Создает объект класса string с именем str и значением, являющимся копией значения параметра aString типа string.

Доступ к элементам

str[i]

Обращение для чтения и записи к символу с индексом i строки с именем str.

str.substr(position, length)

Возвращает часть строки, начинающуюся с позиции position и имеющую длину length (только для чтения).

str.c_str()

Представляет доступ только для чтения к строке, представленной объектом str.

str.at(i)

Обращение для чтения и записи к символу строки str, который имеет индекс i.

Присвоение/изменение

str1=str2;

Выделяет для строки str1 объем памяти, равный длине строки str2, и инициализирует строку str1 значением строки str2.

str1+=str2

Символы строки str2 добавляютяс в конец строки str1, для которой выделяется необходимый объем памяти.

s.empty()

Если строка s является пустой возвращает true, если s не пустая – false.

srt1+str2

Возвращает строку, которая является объединением строк str1 и str2. Для результирующей строки выделяется необходимый объем памяти.

str.insert(pos, str2)

Помещает строку str2 в строку str, начиная с позиции pos.

str.remove(pos, len)

Удаляет из строки str подстроку длиной len, начинающуюся с позиции pos.

Сравнения

str1 == str2

str1 != str2

Проверяет равны строки или нет. Возвращает соответствующее логическое значение.

str1 < str2

str1 > str2

str1 <= str2

str1 >= str2

Лекcикографическое сравнение строк

str.find(str1)

Возвращает индекс начала подстроки str1, входящей в строку str.

str.find(str1, pos)

Возвращает индекс начала подстроки str1, входящей в строку str. Поиск начинается с позиции pos.

str.find_first_not_of(str1, pos)

Определяет, в какой позиции в строке str встречается первый символ, отсутствующей в строке str1. Поиск начинается с позиции pos.

Копирование

strncpy(char *str1,const char *str2, size count)

Копирует count символов из строки с адресом str2 в массив str1.

str2 должен указывать на строку с завершающим нулевым символом. Если длина строки с указателем str2 меньше значения count, то в конце строки-результата str1 добавляются недостающие нулевые символы. Наоборот, если длина строки с указателем str2 больше значения count, резулбтирующая строка с указателем str1 автоматически не получит завершающего нуля.

Возвращаемое значение указатель str1.

До настоящего времени в своих программах при выводе русских текстов мы использовали функцию изменения кодировки консоли SetConsoleOutput(1251). Но можно поступить иначе. Среди функций, входящих в библиотеку windows есть такие, которые перекодируют символы из одной кодовой таблицы в другую. В частности, CharToOem (OEM stands for original equipment manufacturer) – функция, которая может перекодировать символы ANSI т.е. кодировку 1251 в ОЕМ, а функция OemToChar перекодировать их обратно. Работают эти функции следующим образом. Сначала нужно занести каким угодно образом текст в память. После этого запустить функцию, указав адрес начала переводимой строки, и начальный адрес в который будет записан перевод, т.е. синтаксис функции имеет вид:

bool сharToOem(начальный_адрес_строки_предназначенной_для_перевода, адрес_куда_пишется перевод)

Вот пример программы:

#include <iostream>

#include <windows.h>

#include <string>

using namespace std;

void main(){

string str = "Строка для перекодировки";

CharToOem( &str[0], &str[0] );

cout << str<<endl;

}

Если вспомнить, что имя массива на самом деле является указателем, то можно перекодировку осуществлять с помощью массива.

#include <iostream>

#include <windows.h>

#include <string>

using namespace std;

void main(){

char str[100] = "Строка для перекодировки";

CharToOem(str, str );

cout << str<<endl;

}

Можно еще проще

#include <iostream>

#include <windows.h>

#include <string>

using namespace std;

void main(){

char str[100] ;

CharToOem("Строка для перекодировки", str );

cout << str<<endl;

}