Функции для работы со строками
Для строк не определена операция присваивания, поскольку строка является не основным типом данных, а массивом. Присваивание выполняется с помощью функций стандартной библиотеки 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, и вычислить по правилам десятичной арифметики: