Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_лаб_4.doc
Скачиваний:
1
Добавлен:
21.09.2019
Размер:
678.4 Кб
Скачать

Функции для работы со строками

Для строк не определена операция присваивания, поскольку строка является не основным типом данных, а массивом. Присваивание выполняется с помощью функций стандартной библиотеки strcpy или strncpy или посимвольно «вручную».

Функция strcpy (char *s1, char *s2) копирует все символы строки, указанной вторым параметром, включая завершающий 0, в строку, указанную первым параметром.

Функция strncpy (char *s1, char *s2, n) выполняет то же самое, но не более n символов. Если нуль-символ встретился в исходной строке раньше, то копирование прекращается, а оставшиеся до n символы строки s2 заполняются нуль-символами. В противном случае (если n меньше или равно длине строки s1) завершающий нуль-символ в s2 не добавляется.

Функция strlen(char *s) возвращает фактическую длину строки s, не включая нуль-символ.

Функции strcat и strncat используются для объединения строк.

Функция strcat (char *s1, char*s2) добавляет копию строки s2, включая завершающий нуль-символ, в конец строки s1. Первый символ строки s2 размещается в байте, в котором был записан нуль-символ строки s1. Если строка s1 заполнена, а s2 – не нулевая строка, то вызов strcat (s1, s2); перезапишет конец строки. Следите за длиной результирующей строки при конкатенации строк при вызове функции strcat (. . .).

Функция strncat(char *s1, char *s2, n) позволяет добавить не более чем n символов строки s2 в конец строки s1.

Функция strcmp (char *s1, char *s2) позволяет сравнить 2 строки. Функция возвращает 0, если строки равны, отрицательное значение, если первая строка меньше, чем вторая, и положительное значение, если первая строка больше, чем вторая. Функция strncmp (char *s1, char *s2, n) проводит сравнение только первых n символов двух строк.

Функции stricmp и strnicmp позволяют сравнивать строки без учета регистра, т.е. без различия между прописными и строчными буквами.

Функция strchr (const char *s, int c) реализует поиск одиночного символа в строке. Она возвращает значение NULL, если символ-аргумент в строке не найден, иначе возвращает указатель на этот символ.

Функция strcspn (char *s1, char *s2) - определяет и возвращает длину начальной части строки s1, состоящей из символов, не содержащихся в строке s2.

Функция strspn (const char *s1, const char *s2) - определяет и возвращает длину начальной части строки s1, состоящей только из символов, содержащихся в строке s2.

Функция strpbrk (char *s1, char *s2) - определяет позицию первого вхождения в строку s1 любого из символов строки s2. Если символ не найден, то возвращается указатель NULL.

Функция strstr (char *s1, char *s2) - определяет позицию первого вхождения в строку s1 подстроки s2. Если подстрока не найдена, то возвращается указатель NULL.

Функция char* strtok (char *s1, const char *s2) интерпретирует строку s1 как последовательность лексических единиц (слов), разделенных ограничителями, которые заданы в строке-аргументе, соответствующей параметру s2. Функция возвращает указатель на первую из найденных лексических единиц или значение NULL, если таких единиц в строке-аргументе нет. После выделения лексической единицы из аргумента s1 непосредственно за ней размещается символ с нулевым кодом. Таким образом, функция разбивает переданную ей строку (первый аргумент вызова) на лексемы в соответствии с заданным набором разделителей (второй аргумент). Эту функцию можно использовать для выделения в строке лексем-слов. Функция изменяет разбиваемую на лексемы строку, поэтому необходимо позаботиться о предварительном сохранении строки.

Функции для работы со строками

для Microsoft Visual Studio 2005

Функции

strcpy_s (char *s1, size_t n, char* s2)

strcat_s (char *s1, size_t n, char* s2)

strncat_s (char *s1, size_t n, char *s2, k)

_strlwr_s ( char *s1, size_t n)

_strupr_s( char *s1, size_t n)

аналогичны предыдущим функциям, n – размер строки s1. Как правило возвращают 0, если функция выполняется корректно.

Функция strtok_s (char *s1, const char *s2, char** sm) аналогична функции strtok. Причем sm – содержит начало следующей лексемы строки.

Ввод С-строк

При вводе строки с клавиатуры (помещение в поток cin) следует контролировать длину вводимой строки (чтобы она не превышала длину массива, где будет храниться строка

const int MAX=100;

char str[MAX];

cin >> setw (MAX) >> str; // Ввод до MAX-1 символов

При помещении строки в поток cin пробелы и символы новой строки конвертируются в завершающий нулевой байт

const int MAX=100;

char str [MAX];

cin >> setw (MAX) >> str;

// Введем строку "Good Morning"

cout << str; // Получим "Good"

Чтобы ввести строку, содержащую пробелы, необходимо вызвать встроенную функцию getline для потока cin:

char str [MAX];

cin.getline (str, MAX);

или можно задать свой разделитель строк:

char str [MAX];

char SEP = '$';

// Задаем свой разделитель строк

cin.getline (str, MAX, SEP);

Строки стандартного класса string

Язык С++ включает в себя новый класс, называемый string. Этот класс во многом улучшает традиционный строковый тип, позволяет обрабатывать строки также как данные других типов, а именно с помощью операторов. Он более эффективен и безопасен в использовании, не нужно заботиться о создании массива нужного размера для строковой переменной, класс string берет на себя ответственность за управлением памятью.

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

Для работы со строками класса string существует множество методов и операций.

Объявление и инициализация строк string.

//создаем пустую строку

//вызов конструктора без аргументов

string s1;

// создаем строку из C-строки

//вызов конструктора с одним аргументом

string s2("aaaa");

// string s2 = "aaaa"; // или так

// создаем строку из C-строки 10 символов

//вызов конструктора с двумя аргументами

string s3("abcdefghijklmnopqrstuvwxyz",10);

// создаем строку из 5 одинаковых символов

string s4(5,’!’);

// создаем строку-копию из строки s3

string s5(s3);

// создаем строку-копию из строки s3

// начиная с индекса 5 не более 3 символов

string s6(s3,5,3);

Методы для работы со строками класса string

МЕТОД

ЗАПИСЬ

ОПИСАНИЕ

1

at

at (unsigned n)

доступ к n-му элементу строки

2

append

append (string &str)

добавляет строку str к концу вызывающей строки

(тоже, что оператор + )

append (string &str, unsigned pos, unsigned n);

добавляет к вызывающей строке n символов строки str, начиная с позиции pos

append ( char *sr, unsigned n);

добавляет к вызывающей строке n символов С-строки s

3

assign

assign (string &str)

присваивает строку str вызывающей строке (тоже, что s2=s1)

assign ( string &str, unsigned pos, unsigned n);

присваивает вызывающей строке n символов строки str, начиная с позиции pos

assign ( char *sr, unsigned n);

присваивает вызывающей строке n символов C-строки s

4

capacity

unsigned int capacity ();

возвращает объем памяти, занимаемый строкой

5

compare

int compare (string &str);

сравнение двух строк, возвращает значение <0, если вызывающая строка лексикографически меньше str, =0, если строки равны и >0, если вызывающая строка больше

int compare (string &str, unsigned pos, unsigned n);

сравнение со строкой str n символов вызывающей строки, начиная с позиции pos; возвращает значение <0, если вызывающая строка лексикографически меньше str, =0, если строки равны и >0, если вызывающая строка больше

int compare (unsigned pos1, unsigned n1, string &str, unsigned pos2, unsigned n2);

n1 символов вызывающей строки, начиная с позиции pos1, сравниваются с подстрокой строки str длиной n2 символов, начиная с позиции pos2; возвращает значение <0, если вызывающая строка лексикографически меньше str, =0, если строки равны и >0, если вызывающая строка больше

6

copy

unsigned int copy (char *s, unsigned n, unsigned pos = 0);

копирует в символьный массив s n элементов вызывающей строки, начиная с позиции pos; нуль-символ в результирующий массив не заносится; метод возвращает количество скопированных элементов

7

c_str

char * c_str()

возвращает указатель на С-строку, содержащую копию вызываемой строки; полученную С-строку нельзя изменить

8

empty

bool empty();

возвращает истину, если строка пустая

9

erase

erase (unsigned pos = 0, unsigned n = npos);

удаляет n элементов, начиная с позиции pos (если n не задано, то удаляется весь остаток строки) npos-самое большое число >0 типа unsigned

10

find

unsigned int find (string &str, unsigned pos = 0);

ищет самое левое вхождение строки str в вызывающей строке, начиная с позиции pos; возвращает позицию вхождения, или npos(самое большое число >0 типа unsigned , если вхождение не найдено

unsigned find (char c, unsigned pos = 0);

ищет самое левое вхождение символа с в вызывающей строке, начиная с позиции pos; возвращает позицию вхождения, или npos(самое большое число >0 типа unsigned, если вхождение не найдено

unsigned rfind (char c, unsigned pos = 0);

ищет самое правое вхождение символа с в вызывающей строке, начиная с позиции pos; возвращает позицию вхождения, или npos(самое большое число >0 типа unsigned, если вхождение не найдено

11

find_last_of

unsigned find_last_of (string &str, unsigned pos = 0);

ищет самое правое вхождение любого символа строки str в вызывающей строке, начиная с позиции pos; возвращает позицию вхождения, или npos(самое большое число >0 типа unsigned, если вхождение не найдено

12

insert

insert (unsigned pos, string &str);

вставляет строку str в вызывающую строку, начиная с позиции pos

insert (unsigned pos1, string &str, unsigned pos2,

unsigned n);

вставляет в вызывающую строку, начиная с позиции pos1 n символов строки str, начиная с позиции pos2

insert (unsigned pos, char * sr, unsigned n);

вставляет в вызывающую строку n символов C-строки s, начиная с позиции pos

13

length

unsigned length ();

возвращает размер строки

14

max_size

unsigned max_size();

возвращает максимальную длину строки

15

replace

replace (unsigned pos, unsigned n, string &str);

заменяет n элементов, начиная с позиции pos вызывающей строки, элементами строки str

replace (unsigned pos1, unsigned n1, string &str, unsigned pos2, unsigned n2);

заменяет n1 элементов, начиная с позиции pos1 вызывающей строки, n2 элементами строки str, начиная с позиции pos2

replace (unsigned pos, unsigned n1, char *s, unsigned n2);

заменяет n1 элементов, начиная с позиции pos вызывающей строки, n2 элементами C-строки s

16

size

unsigned size();

возвращает размер строки

17

substr

string substr(unsigned pos = 0, unsigned n = npos);

выделяет подстроку длиной n из исходной строки, начиная с позиции pos

18

swap

swap (string &str)

обменивает содержимое вызывающей строки и строки str

Операции для работы со строками класса string

оператор

ЗАПИСЬ

string s1,s2,s3;

ОПИСАНИЕ

1

+

s3 = s1+ s2;

конкатенация (сцепление) строк, можно присоединить единичный символ к строке

2

+=

s1 += s2;

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

3

=

s2 = s1;

присваивание

4

==

s2 == s1

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

5

!=

s2 != s1

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

6

>

s2 > s1

лексикографическое сравнение строк на >

7

>=

s2 >= s1

лексикографическое сравнение строк на >=

8

<

s2 < s1

лексикографическое сравнение строк на <

9

<=

s2 <= s1

лексикографическое сравнение строк на <=

10

[]

s1[i]

индексация (обращение к элементу строки)

11

>>

cin >> s1;

ввод строки (лучше метод getline)

12

<<

cout << s2;

вывод строки

ПРИМЕР 1. Инициализация С-строки

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 8;

//нулевой символ добавляется к концу строки автоматически

char str1[MAX] = "stroka1";

//нулевой символ добавляется к концу строки автоматически

char str2[] = "stroka2";

// нет \0

char str3[] = {'s', 't', 'r', 'o', 'k', 'a', '3'};

char str4[] = {'s','t','r','o','k','a','4','\0'};

char str5[MAX];

char *str6 = "stroka6";

cout << " 1 " << str1 << endl;

cout << " 2 " << str2 << endl;

cout << " 3 " << str3 << endl;

cout << " 4 " << str4 << endl;

// !!! нельзя константный указатель

str5 = "stroka5";

cout << " 5 " << str5 << endl;

cout << " 6 " << str6 << endl;

// !!! можно !!!

str6 = "stroka";

cout << " 6 " << str6 << endl;

}

ПРИМЕР 2. Ввод С-строки. Инструкция cin

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char str[MAX];

cout << " Enter a string: ";

//ввод выполняется до первого пробельного символа

cin >> str;

cout << "You entered: " << str << endl;

}

ПРИМЕР 3. Ввод С-строки. Функция gets

#include <stdio.h> // for gets puts

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int n = 80;

char s[n];

cout << " Enter a string: ";

gets(s); // gets_s(s);

cout << "You entered: ";

puts(s); // puts_s (s);

}

ПРИМЕР 4. Ввод С-строки. Метод get

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char str [MAX];

char c;

cout << " 1 Enter a string: ";

// символ перевода строки '\n' остается в потоке

// в строковую переменную добавляется '\0'

cin.get (str, MAX);

cout << " 1 You entered: " << str << endl;

cin.get(); // удаление из потока символа ‘\n’.

cout << "\n 2 Enter a string:\n";

// свой разделитель для ввода строки

cin.get(str, MAX, '$');

cout << " You entered:\n" << str << endl;

c = cin.get(); // удаление из потока символа ‘$’.

cout<<c<<endl;

c = cin.get(); // удаление из потока символа ‘\n’.

cout<<int(c)<<endl;

cout << "\n 3 Enter a string: ";

//символ перевода строки '\n' остается в потоке

//в строковую переменную добавляется '\0'

cin.get (str, MAX);

cout << "3 You entered: " << str << endl;

cin.get(); // удаление из потока символа ‘\n’.

}

ПРИМЕР 5. Ввод С-строки. Метод getline

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char str [MAX];

cout << "\n 1 Enter a string: ";

//при этом '\n' также считывается (удаляется) из потока

//и вместо него в строковую переменную записывается '\0'

cin.getline (str, MAX);

cout << "1 You entered: " << str << endl;

cout << "\n 2 Enter a string: ";

//свой разделитель для ввода строки

//при этом '\n' также считывается (удаляется) из потока

//и вместо него в строковую переменную записывается '\0'

cin.getline (str, MAX, '&');

cout << "2 You entered: " << str << endl;

}

ПРИМЕР 6. Ввод С-строки с русскими буквами

#include <windows.h>

#include <iostream> // cin cout

using namespace std;

void main()

{

char buff[80];

cin.getline(buff,80); // "русский текст"

cout << "Моя программа"<< endl;

// на экране набор знаков

cout << buff << endl;

// на экране : "русский текст"

setlocale(LC_ALL, "rus");

cout << "Моя программа"<< endl;

// на экране: "Моя программа"

cout << buff << endl;

// на экране набор знаков

OemToAnsi(buff, buff);

cout << "Моя программа"<< endl;

// на экране: "Моя программа"

cout << buff << endl;

// на экране : "русский текст"

}

ПРИМЕР 7. Ввод С-строк. Метод getline

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int n = 80;

char s[n];

// выход из цикла – конец файла – Ctrl+z

while (cin.getline(s, n))

{

if (! strcmp(s,""))

break;

cout << s << endl;

// .......... обработка строки

}

}

ПРИМЕР 8. Преобразование двоичного числа в десятичное.

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main ()

{

char str[80];

long int dec;

int i, v = 1;

// двоичное число задаем в виде строки

cout << " Enter number v 2 ss ";

cin.getline (str, 80);

dec = 0;

for (i = strlen(str)-1; i >= 0; i--)

{ // значение элемента строки 0 или 1

if (str[i] == '1' )

{

dec += v; // добавляем к результату

cout<<v<<" ";

}

v *= 2; // вес следующего разряда

}

cout<<endl<<" result v 10 ss =" <<dec<<endl;

}

ПРИМЕР 9. Преобразование десятичного числа в двоичное.

#include <iostream> // for cin cout

using namespace std;

void main ()

{

char str[80];

int n, r;

cout<<" vvedite number v 10 ss"<<endl;

cin>>n;

int i = 0;

do

{

r = n % 2; //остаток от деления на основание с/с

n = n / 2; // частное от деления на основание с/с

str[i] = char('0' + r);

i++;

}

while (n > 0);

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

for(int j = 0; j < i / 2; j++)

// меняем порядок цифр на обратный

{ int c = str[j];

str[j] = str[i – j – 1];

str[i – j – 1] = c;

}

// конец строки i – номер позиции

str[i] = '\0';

cout<<" result v 2 ss= " <<str<<endl;

}

ПРИМЕР 10. Работа с символами С-строки

Задана строка символов. Получить новую строку из исходной, удалив символы ‘*’ и удвоив букву A (а).

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char str1 [MAX], str2 [MAX];

unsigned int i, k = 0;

cout << " Enter a string: ";

cin.getline (str1, MAX);

for (i = 0; str1[i]; i++)

{

if (str1[i] == '*') // если * пропускаем

continue;

// если А или а удваиваем

if (str1[i] == 'A'|| str1[i] == 'a')

str2[k++] = str1[i];

// в остальных случаях записываем в результирующую строку

str2[k++] = str1[i];

}

str2[k] = '\0'; // конец строки

cout << " Rezult = " << str2<< endl;

}

ПРИМЕР 11. Копирование С-строк. Функции strcpy, strcpy_s

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

char st [20] = "*******************"; // 19 '*'

int i, err;

for (i = 0; i <= 19; i++)

cout << st[i];

cout << endl<< st << " " << strlen (st) << endl;

strcpy(st, "Good Morning");

for (i = 0; i <= 19; i++)

cout << st[i];

cout << endl<< st << " " << strlen (st) << endl;

err = strcpy_s(st, 20, "Hello World");

if (!err)

for (i = 0; i <= 19; i++)

cout << st[i];

cout << endl<< st << " " << strlen (st) << endl;

strcpy(st, "Hello");

for (i = 0; i <= 19; i++)

cout << st[i];

cout << endl<< st << " " << strlen (st) << endl;

cout << endl;

}

ПРИМЕР 12. Сравнение С-строк. Функции strcmp и strlen

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char buffer[MAX] = "";

int count = 0;

while (true)

{

cout << "Enter a string of less than 80

characters:\n";

cin.getline(buffer, MAX);

if (! strcmp(buffer, ""))

break;

for (count=0; buffer[count] != '\0'; count++);

cout << count << " " << strlen(buffer) <<endl;

}

}

ПРИМЕР 13. Объединение С-строк. Функции strcat, strncat, strcat_s, strcncat_s

#include <string.h> // for strcat strncat

#include <iostream> // for cin cout

using namespace std;

void main()

{ const int MAX = 80;

char s1[MAX] = "1", s2[MAX] = "22222", s3[MAX] = "333";

char* s4;

int err;

cout<<" 1 "<<endl;

cout<<" str1="<< s1<<endl;

cout<<" str2="<< s2<<endl;

cout<<" 2 "<<endl;

cout<<"str1+str2="<< strcat(s1, s2)<<endl;

cout<<" str1="<< s1<<endl;

cout<<" 3 "<<endl;

cout<<" str1="<< s1<<endl;

s4 = strcat(s1, s2);

cout<<" str1="<< s1<<endl;

cout<<"s4=str1+str2="<< s4<<endl;

cout<<" 4 "<<endl;

err = strcat_s(s1, MAX, s2);

if (!err) cout<<"str1+str2="<< s1<<endl;

cout<<" 5 "<<endl;

cout<<" str3="<< s3<<endl;

cout<<"str3+str2 ="<<strncat(s3, s2, 2)<<endl;

cout<<" str3="<< s3<<endl;

cout<<" 6 "<<endl;

s4 = strncat(s3, s2, 2);

cout<<" str3="<< s3<<endl;

cout<<"str4=str3+str2="<< s4<<endl;

cout<<" 7 "<<endl;

err = strncat_s(s3, MAX, s2, 2);

if (!err) cout<<"str1+str2="<< s3<<endl;

}

ПРИМЕР 14. Вхождение символа в С-строку. Функция strchr

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char s[MAX] = "1234567890abcdefghABCDEFGH";

char c;

char* str;

int n;

cout<<" c = "<<endl;

cin>>c;

while(c != '!')

{

str = strchr(s, c);

if (str != NULL)

{ // определение позиции найденного символа

n = int (str – s) ;

cout<<" simvol ="<<c<< " v"<<n<<"pozicii"<< endl;

}

else

cout<<" simvola ="<<c<< " net "<<endl;

cout<<" c= "<<endl;

cin>>c;

}

}

ПРИМЕР 15. Вхождение С-подстроки в С-строку. Функция strstr

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char s1[MAX], s2[MAX];

char* str;

int n;

cout << " s1= \n";

cin.getline(s1, MAX);

while(true)

{

cout << " s2= \n";

cin.getline(s2, MAX);

if (! strcmp(s2, ""))

break;

str=strstr(s1, s2);

if (str != NULL)

{

// определение позиции найденной подстроки

n = int (str - s1);

cout<<" s2 v s1 c ="<<n<<"pozicii"<<endl;

}

else

cout<<" s2 no s1"<<endl;

}

}

ПРИМЕР 16. Вхождение символов в С-строку. Функции strspn, strcspn

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char s1[MAX], s2[MAX];

int n1, n2;

cout << " s1= \n";

cin.getline(s1, MAX);

while(true)

{

cout << " s2= \n";

cin.getline(s2, MAX);

if (! strcmp(s2,""))

break;

n1 = strspn(s1, s2);

cout<<" dlina first part s1 only iz simvolov

s2 = "<< n1<<endl;

n2 = strcspn(s1, s2);

cout<<endl<<" dlina first part no simvolov

s2 = "<< n2<<endl;

}

}

ПРИМЕР 17. Определение С-подстроки из С-строки. Функция strpbrk

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char s1[MAX], s2[MAX];

char* str;

cout << " s1= \n";

cin.getline(s1, MAX);

while(true)

{

cout << " s2= \n";

cin.getline(s2, MAX);

if (! strcmp(s2,""))

break;

str = strpbrk(s1,s2);

if (str != NULL)

cout<<" podstroka s1 "<<str<<endl;

else

cout<<" v s1 net simvolov iz s2 "<<endl;

}

}

ПРИМЕР 18. Замена символов в С-строке из нижнего регистра в верхний. Функции strupr, _strupr_s

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char str[MAX];

char *s;

int err;

cout << " str= ";

cin.getline(str, MAX);

s = strupr(str);

cout<<str<<" rezult = "<< s <<endl;

cout << " str= ";

cin.getline(str, MAX);

err = _strupr_s(str, MAX);

if (!err)

cout<<" rezult = "<< str <<endl;

}

ПРИМЕР 19. Замена символов в С-строке из верхнего регистра в нижний. Функции strlwr,_strlwr_s

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char str [MAX];

char * s;

int err;

cout << " str= ";

cin.getline(str, MAX);

s = strlwr(str);

cout<<str<<" rezult = "<<s<<endl;

cout << " str= ";

cin.getline(str, MAX);

err = _strlwr_s (str, MAX);

if (!err)

cout<<" rezult = "<< str <<endl;

}

ПРИМЕР 20. Преобразование С-строки в число. Функции atoi, atof

#include <string.h> // for strcmp

#include <stdlib.h> // for atoi atof

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char str[MAX] = "abcd";

int i;

double f;

i = atoi(str);

cout<<i<<endl;

while (true)

{

cout << "1 Enter a string \n";

cin.getline(str, MAX);

if (! strcmp(str,""))

break;

i = atoi(str);

cout<<i<<endl;

}

while (true)

{

cout<<"2 Enter a string \n";

cin.getline(str, MAX);

if (! strcmp(str,""))

break;

f = atof(str);

cout<<f<<endl;

}

}

ПРИМЕР 21. Преобразование С-строки в число. Функция strtol

#include <string.h> // for strcmp

#include <stdlib.h> // for strtol

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char str[MAX] = "abcd";

char *err;

long l;

int base;

cout<< " 1 " <<endl;

l = strtol(str, &err, 10);

cout<<l<<endl; // полученное число в 10-ой с/с

cout<<err<<endl;

// строка, содержащая ошибочное значение, если

// перевод выполнен некорректно

// = NULL, если перевод выполнен корректно

cout<< " 2 " <<endl;

l = strtol(str, &err, 16);

cout<<l<<endl; // полученное число в 16-ой с/с

cout<<err<<endl;

while (true)

{

cout << "1 Enter a string \n";

cin.getline(str, MAX);

if (! strcmp(str,""))

break;

cout << endl<< " Enter a base \n" ;

cin >> base;

// число по основанию base

l = strtol(str, &err, base);

cout<<l<<endl;

cout<<err<<endl;

}

}

ПРИМЕР 22. Преобразование С-строки в число. Функция strtod

#include <string.h> // for strcmp

#include <stdlib.h> // for strtol

#include <iostream> // for cin cout

using namespace std;

void main()

{

const int MAX = 80;

char *str, *err;

double d;

cout<< " 1 " <<endl;

str = "1.1";

d = strtod(str, &err);

cout<<d<<endl; // полученное число

cout<<err<<endl;

// = NULL, если перевод выполнен корректно

cout<< " 2 " <<endl;

str = "1,1";

d = strtod(str, &err);

cout<<d<<endl; // полученное число

cout<<err<<endl;

// строка, содержащая ошибочное значение, если

// перевод выполнен некорректно

cout<< " 3 " <<endl;

str = "1e-3";

d = strtod(str, &err);

cout<<d<<endl; // полученное число

cout<<err<<endl;

// = NULL, если перевод выполнен корректно

cout<< " 4 " <<endl;

str = "e-3";

d = strtod(str, &err);

cout<<d<<endl; // полученное число

cout<<err<<endl;

// строка, содержащая ошибочное значение, если

// перевод выполнен некорректно

}

ПРИМЕР 23. Преобразование числа в С-строку. Функции itoa, _itoa_s, ltoa, _ltoa_s, utoa, _utoa_s

#include <string.h>

#include <stdlib.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{ const int MAX = 80;

char str[MAX] = "";

int a;

// преобразование целого числа в строку

// функции

// char* itoa(int value,char *string,int radix);

// char* ltoa(long value, char *string, int radix );

// char* ultoa(unsigned long val,char *str,int radix );

// 2<=radix<=36 - основание с/с в которой получим число

cout << "Enter number \n";

cin>>a;

itoa(a, str, 2);

// _itoa_s(a, str, 2);

cout<<" number in 2 s/s ="<<str<<endl;

ltoa(a, str, 10);

// _ltoa_s(a, str, 10);

cout<<" number in 10 s/s ="<<str<<endl;

ultoa(a, str, 16);

// _ultoa_s(a, str, 16);

cout<<" number in 16 s/s ="<<str<<endl;

itoa(a, str, 22);

// _itoa_s(a, str, 22);

cout<<" number in 22 s/s ="<<str<<endl;

}

ПРИМЕР 24. Преобразование числа в С-строку. Функция fcvt, _fcvt_s

#include <string.h>

#include <stdlib.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

// преобразование вещественного числа в строку

//char* fcvt(double value,int count,int *dec,int *sign );

// count - число цифр дробной части

// dec - количество цифр целой части

// sign - знак числа (0 или 1)

const int MAX = 80;

int decimal, sign, err;

char *buffer;

double source;

cout << "Enter number \n";

cin>>source;

buffer = fcvt(source, 7, &decimal, &sign);

// результат в buffer

cout<<source<<" "<<buffer<<" "<<decimal<<" "<<sign<<endl;

err = _fcvt_s(buffer, MAX, source, 7, &decimal, &sign);

// результат в buffer

// вслучае успеха возвращает 0 в err

if (err != 0)

{

cout<<"error"<<err<<endl;

}

else

cout<<source<<" "<<buffer<<" "<<decimal<<" "<<sign<<endl;

}

ПРИМЕР 25. Выделение лексем. Функции strtok, strtok_s

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

char str[80];

//строка из разделителей

const char razd[] = " ,?!;-.";

char *Ptr, *Ntr;

cout << " Enter a string: ";

cin.getline (str, 80);

// первый вызов функции первый параметр – строка,

// второй – строка из разделителей лексем

Ptr = strtok (str, razd);

// Ptr = strtok_s(str, razd, &Ntr);

int i = 0;

while (Ptr != NULL)

{

cout << Ptr << endl; // очередная лексема

i++; // количество лексем

// вызов функции для выделения следующей лексемы

// первый параметр NULL !!!

Ptr = strtok(NULL, razd);

// Ptr = strtok_s(NULL, razd, &Ntr);

}

cout<<" vvedeno "<<i<<" lecsem"<<endl;

cout<<str<<endl;

// изменилась ли исходная строка ???

}

ПРИМЕР 26. Указатели и С-строки

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

void main()

{

char str1[] = "stroka - array";

char *str2 = "stroka - pointer";

char *p;

int i;

cout << str1 << endl;

cout << str2 << endl;

// вычисление значения функции strlen

// на каждой итерации цикла

for (i = 0; i < strlen (str1); i++)

cout << str1[i]; // вывод посимвольно

cout<<endl;

// вычисление значения функции strlen

// на каждой итерации цикла

for (i = 0; i < strlen (str2); i++)

cout << str2[i]; // вывод посимвольно

cout<<endl;

// вывод посимвольно через указатель !!!

// эффективнее предыдущего

for (p = str1; *p; p++)

cout << *p;

cout<<endl;

// вывод посимвольно через указатель !!!

// эффективнее предыдущего

for (p = str2; *p; p++)

cout << *p;

cout<<endl;

// str1++; // !!! нельзя константный указатель

str2++; // !!! можно

cout << str2 << endl; // строка без первого символа

str2 = "new stroka - pointer"; // !!! можно

cout << str2 << endl;

// !!! нельзя константный указатель

// str1 = "new stroka - array";

}

ПРИМЕР 27. Массивы С-строк

#include <iostream> // for cin cout

using namespace std;

void main()

{

char* pointer[ ] =

{"11111", "22222222", "33333333333","44444444444"};

char array [ ][12] =

{"11111", "22222222", "33333333333", "44444444444"};

int i;

for ( i = 0; i < 4; i++)

cout<<pointer[i]<<endl;

cout<<endl;

for ( i = 0; i < 4; i++)

cout<<array[i]<<endl;

cout<<endl;

for ( i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

cout<<pointer[i][j];

cout<<endl;

}

cout<<endl;

for ( i = 0; i < 4; i++)

{

for ( int j = 0; j < 4; j++)

cout<<array[i][j];

cout<<endl;

}

}

ПРИМЕР 28. *** Массивы С-строк

Запустите программу и объясните результаты.

#include <iostream> // for cin cout

using namespace std;

void main()

{

char *c[ ] =

{"11111", "22222222", "333333333333", "444444444444"};

char **cp[] = {c+3,c+2,c+1,c};

char ***cpp = cp;

int i;

cout <<" 1 "<<endl;

cout <<" &cpp= " << &cpp<<endl;

cout <<" cpp= " << cpp<<endl;

cout <<" *cpp= " << *cpp<<endl;

cout <<" **cpp= " << **cpp<<endl;

cout <<"***cpp= " << ***cpp<<endl;

cout<<endl<<" 2 "<<endl;

for ( i = 0; i < 4; i++)

{

cout<<" i= "<<i<<endl;

cout<<" *cpp[i]= " << *cpp[i] <<endl;

cout<<" **cpp[i]= " << **cpp[i] <<endl;

cout<<" *cp[i]= " << *cp[i] <<endl;

cout<<" **cp[i]= " << **cp[i] <<endl;

cout<<" c[i]= " << c[i] <<endl;

cout<<" *c[i]= " << *c[i] <<endl<<endl;

}

cout<<endl<<" 3 "<<endl;

for ( i = 0; i < 4; i++)

{

cout <<" i= "<<i<<endl;

cout<<" **(cpp+i)= " << **(cpp+i) <<endl;

cout<<" ***(cpp+i)= " << ***(cpp+i) <<endl;

cout<<" **(cp+i)= " << **(cp+i) <<endl;

cout<<" ***(cp+i)= " << ***(cp+i) <<endl;

cout<<" *(c+i)= " << *(c+i) <<endl;

cout<<" **(c+i)= " << **(c+i) <<endl;

}

}

ПРИМЕР 29. Объявление и инициализация строки string

#include <iostream>

#include <string> // строковый класс

using namespace std;

void main()

{

string s1; //создаем пустую строку

string s2("aaaa"); // создаем строку из C-строки

// создаем строку из C-строки 10 символов

string s3("abcdefghijklmnopqrstuvwxyz",10);

// создаем строку из 5 одинаковых символов

string s4(5,’!’);

// создаем строку-копию из строки s3

string s5(s3);

// создаем строку-копию из строки s3

// начиная с индекса 5 не более 3 символов

string s6(s3,5,3);

cout<<"s1= "<<s1<<endl;

cout<<"s2= "<<s2<<endl;

cout<<"s3= "<<s3<<endl;

cout<<"s4= "<<s4<<endl;

cout<<"s5= "<<s5<<endl;

cout<<"s6= "<<s6<<endl;

}

ПРИМЕР 30. Инициализация строки string. Оператор =. Метод assign

#include <iostream>

#include <string> // строковый класс

using namespace std;

void main()

{

string s1, s2, s3;

// в классе string определены три оператора присваивания:

// string & operator = (const string& str);

// string & operator = (const char* s);

// string & operator = (char c);

s1 = '1';

s2 = "bbbbbb";

s3 = s2;

cout<<"s1= "<<s1<<endl;

cout<<"s2= "<<s2<<endl;

cout<<"s3= "<<s3<<endl;

// метод assign

s2.assign("ccccccc"); // s2=”cccccccc”

s3.assign(s2); // s3=s2

cout<<"s1 = "<<s1<<endl;

cout<<"s2 = "<<s2<<endl;

cout<<"s3 = "<<s3<<endl;

s2.assign("1234"); // s2=”1234”

// в s3 из s2 3 символа, начиная с 1 позиции

s3.assign(s2,1,3);

cout<<"s2= "<<s2<<endl;

cout<<"s3= "<<s3<<endl;

char s[]="56789";

// присваивает s3 3 символа С-строки

s3.assign(s,3);

cout<<"s= "<<s<<endl;

cout<<"s3= "<<s3<<endl;

}

ПРИМЕР 31. Ввод строки string. Оператор >>

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1;

cout << " Enter a string: ";

//ввод выполняется до первого пробельного символа

cin >> s1;

cout << "You entered: " << s1 << endl;

}

ПРИМЕР 32. Ввод строки string. Метод getline

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1;

cout << "Enter a string: ";

getline(cin,s1); //ввод строки

cout << "You entered: " << s1 << endl;

cin.get(); // удаление из потока символа ‘\n’.

cout << " Enter a string: ";

// свой разделитель для ввода строки

getline(cin,s1,'&');

cout << "You entered: " << s1 << endl;

cin.get(); // удаление из потока символа ‘&’.

}

ПРИМЕР 33. Длина строки string. Методы length, size

#include <iostream>

#include <string>

using namespace std;

void main()

{

string st("*******************");

cout << " " << st.length()<< " " << st.size() <<

" "<<st.max_size()<<endl;

st = "Good Morning";

cout << " " << st.length()<< " " << st.size() <<

" "<<st.max_size()<<endl;

st = "Hello";

cout << " " << st.length()<< " " << st.size() <<

" "<<st.max_size()<<endl;

}

ПРИМЕР 34. Доступ к элементу строки string. Оператор []. Метод at

#include <iostream>

#include <string>

using namespace std;

void main()

{

string st("*******************");

int i;

for (i = 0; i < st.length(); i++)

cout << st[i];

// если i выходит за пределы строки,

// то поведение не определено

st = "Good Morning";

for (i = 0; i < st.length(); i++)

cout << st.at(i);

// если i выходит за пределы строки,

// метод возвращает исключение типа out_of_rang

st = "Hello";

for (i = 0; i < st.length(); i++)

cout << st[i];

}

ПРИМЕР 35. Сравнение строк. Операторы сравнения

Вводим строки в цикле, выход – ввод “пустой” сроки.

Вывод на экран результатов сравнения двух строк.

#include <iostream>

#include <string>

using namespace std;

void main()

{

string st1, st2;

cout << "Enter a string \n";

getline(cin,st1); // ввод 1 строки

while (true)

{

cout << "Enter a string \n";

getline(cin,st2); // ввод 2 строки

cin.get();

if ( st2 == "")

break; // выход из цикла

cout << endl<< st2 ;

// операторы лексикографического сравнения строк

if (st2 == st1)

cout << " = ";

else

if (st2 < st1)

cout <<" < ";

else

cout << " > ";

cout << st1<<endl ;

st1 = st2;

}

}

ПРИМЕР 36. Сравнение строк. Метод compare

Вводим строки в цикле, выход – ввод “пустой” сроки.

Вывод на экран результатов сравнения двух строк.

#include <iostream>

#include <string>

using namespace std;

void main()

{

string st1, st2;

cout << "Enter a string \n";

getline(cin,st1); // ввод 1 строки

while (true)

{

cout << "Enter a string \n";

cin.get();

getline(cin,st2); // ввод 2 строки

if ( !st2.compare("")) break; // выход из цикла

cout << endl<< st2 ;

// лексикографическое сравнение строк

if (!st2.compare(st1)) cout <<" = ";

else

if (st2.compare(st1)<0) cout <<" < ";

else cout << " > ";

cout << st1<<endl ;

cout << endl <<st2[1]<<st2[2];

// лексикографическое сравнение подстрок

if (!st2.compare(1,2,st1,2,3))

cout <<" = ";

else

if (st2.compare(1,2,st1,2,3)<0)

cout <<" < ";

else

cout << " > ";

cout << st1[2]<<st1[3]<<st1[4]<<endl ;

st1 = st2;

}

}

ПРИМЕР 37. Объединение строк. Оператор +. Метод append

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1("11");;

string s2("2222");

string s3 ("333333");

string s4("44444444");

s1 += s2; // добавить s2 к s1

cout<<"s1 = s1 + s2 = "<<s1<<endl;

s4 = s1 + s2; // добавить s1 к s2

cout<<"s4 = s1 + s2 = "<<s4<<endl;

s4 = s4 + '!'; // добавить s1 к s2

cout<<"s4 = s4 + ! = "<<s4<<endl;

s2.append(s1); // добавить s1 к s2

cout<<"s2 + s1 = "<< s2<<endl;

// добавить к s3 2 символа строки s1 со 1 позиции

s3.append(s4,1,2);

cout<<"s3 + s4 = "<< s3<<endl;

char s[] = "56789";

// добавить к s3 2 символа С-строки s

s3.append(s,2);

cout<<"s3 + s = "<< s3<<endl;

}

ПРИМЕР 38. Вставка строки (подстроки) в строку. Метод insert

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1("1111111");;

string s2("23456789");

s1.insert(3,s2); // вставить s2 в s1 с 3 позиции

cout<<"s1="<< s1<<endl;

s1 = "1111111";

s2 = "23456789";

// вставить 4 символа s2 со 2 позиции в s1 с 3 позиции

s1.insert(3,s2,2,4);

cout<<"s1="<< s1<<endl;

s1 = "1111111";

char s[] = "23456789";

// вставить 4 символа s в s1 с 3 позиции

s1.insert(3,s,4);

cout<<"s1 = "<< s1<<endl;

}

ПРИМЕР 39. Замена строки (подстроки) в строке. Метод replace

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1("1111111");;

string s2("23456789");

// замена 2 символов в s1 с 3 позиции элементами s2

s1.replace(3,2,s2);

cout<<"s1="<< s1<<endl;

s1 = "1111111";

s2 = "23456789";

// замена 2 символов в s1 с 3 позиции 1 символом

// из 4 позиции строки s2

s1.replace(3,2,s2,4,1);

cout<<"s1="<< s1<<endl;

s1 = "1111111";

char s[] = "23456789";

// замена 2 символов в s1 с 3 позиции 4 символами s

s1.replace(3,2,s,4);

cout<<"s1="<< s1<<endl;

}

ПРИМЕР 40. Удаление подстроки в строке. Метод erase

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1("123456789");

// удаление 2 символов в s1 с 3 позиции

s1.erase(3,2);

cout<<"s1="<< s1<<endl;

// удаление всех символов в s1 с 3 позиции

s1 = "123456789";

s1.erase(3);

cout<<"s1="<< s1<<endl;

s1 = "123456789";

s1.erase(); // удаление всех символов s1

cout<<"s1="<< s1<<endl;

}

ПРИМЕР 41. Выделение подстроки в строке. Метод substr

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1("123456789");

string s2;

// s2 – подстрока s1 из 2 символов с 3 позиции

s2 = s1.substr(3,2);

cout<<"s2="<< s2<<endl;

s1 = "123456789";

// s2 – подстрока s1 всех символов с 3 позиции

s2 = s1.substr(3);

cout<<"s2="<< s2<<endl;

s1 = "123456789";

s2 = s1.substr(); // s2=s1

cout<<"s2="<< s2<<endl;

}

ПРИМЕР 42. Обмен содержимого строк. Метод swap

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1("123456789");

string s2("abcdef");

s1.swap(s2);

cout<<"s1="<< s1<<endl;

cout<<"s2="<< s2<<endl;

}

ПРИМЕР 43. Поиск подстроки в строке. Метод find

#include <iostream>

#include <string>

using namespace std;

void main()

{

string s1("123123123");

string s2("12");

unsigned k;

// поиск подстроки s2 в строке s1 с 4 позиции

k = s1.find(s2,4);

cout<<" "<< k<<endl;

// поиск подстроки s2 в строке s1 с 7позиции

k = s1.find(s2,7);

cout<<" "<< k<<endl;

// поиск символа '1' в строке s1 с 4 позиции

k = s1.find('1',4);

cout<<" "<< k<<endl;

// поиск символа '1' в строке s1 с 4 позиции

k = s1.rfind('1',4);

cout<<" "<< k<<endl;

}

ПРИМЕР 44. Строки С и С++. Методы copy, c_str

#include <iostream>

#include <string>

using namespace std;

void main()

{

string str("1234567890");

char s[80];

int k;

// копируем 3 символа str c 5 позиции в s

k = str.copy(s,3,5);

cout<<s<<" "<<k<<endl;

// копируем 3 символа str c 5 позиции в s

k = str.copy(s,3,5);

s[3]='\0';

cout<<s<<" "<<k<<endl;

cout<<str.c_str()<<endl;

}

Правила перевода чисел из одной системы счисления в другую

1. 2  10

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