§ 9.7. Строки

Школьный курс python
Содержание

Символьный тип данных

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

char ch_1 = 'F';
char ch_2 = '\n';

Использование двойных кавычек приведет к ошибке.
Поскольку, как мы уже сказали, тип char является целочисленным, то нередко можно встретить такой трюк для преобразования символ => число:

char cr = '7';
int s = '7' - '0'; // неявное приведение типа
cout << cr << " = " << s << endl;

Объясняется это просто. Код символа '0' равен 48, а код '7' равен 55. Разница кодов дает цифру 7, которая неявно преобразуется к типу int.
Если известен код символа, то можно получить и сам символ, используя операцию приведения типа static_cast. Это освобождает разработчика от запоминания кодов соответствующих символов.
Задача 1. В следующей задаче необходимо вывести коды и соответствующие им символы из кодовой таблицы “аски”. Для этого, в заголовке цикла, необходимо установить тип счетчика char, а в теле цикла применять к счетчику операцию приведения типа.

Программа 9.7.1
#include <iostream>
using namespace std;

int main() {
    for (char i = 'a'; i <= 'z'; i++)
        cout << static_cast<int>(i)
             << " => "
             << i
             << endl;
    return 0;
}

Вывод

97 => a
98 => b
99 => c
100 => d
101 => e
102 => f
...

Специальными символьными литералами являются управляющие последовательности. Они используются для описания определённых специальных символов внутри строковых литералов.

Таблица 1. Escape-последовательности
Символ Описание
\\ backslas
\’ Одинарная кавычка
\” Двойная кавычка
\0 Нулевой символ
\a Звуковой сигнал (ASCII Bell (BEL))
\b Забой (ASCII Backspace (BS))
\f Новая страница (ASCII Formfeed (FF))
\n Новая строка (ASCII Linefeed (LF))
\r Возврат каретки (ASCII Carriage Return (CR))
\t Горизонтальная табуляция (ASCII Horizontal Tab (TAB))
\v Вертикальная табуляция (ASCII Vertical Tab (VT))
\ooo Символ с восьмеричным значением
\xhh Символ с шестнадцатеричным значением
\uxxxx
\Uxxxxxxxx
Произвольное Юникод-значение
Мы уже применяли символ '\n' для перевода на новую строку при выводе матриц. Манипулятор endl, также осуществляет перевод на новую строку, но, в тоже время, производит сброс буфера вывода (а следовательно, и всех форматов при использовании манипуляторов). Поэтому, там, где нужно производить переход на новую строку и, при этом, сохранять форматы, нужно использовать '\n'.

Задача 2. Выведите кодировочную таблицу ASCII с 32 (space) по 127 (del) символ. Для табличного оформления используйте табулятор – '\t'.

Программа 9.7.2
#include <iostream>
using namespace std;

int main() {
    cout << "№  => Символ\t№  => Символ\t№  => Символ" 
         << endl;
    for (int i = 32; i < 64; i++) {
        cout << i << " => " << static_cast<char>(i)
             << "\t\t"
             << i + 32 << " => " << static_cast<char>(i + 32)
             << "\t\t"
             << i + 64 << " => " << static_cast<char>(i + 64)
             << endl;
    }
    return 0;
}

Вывод

№  => Символ    №  => Символ    №  => Символ
32 =>           64 => @         96 => `
33 => !         65 => A         97 => a
34 => "         66 => B         98 => b
35 => #         67 => C         99 => c
36 => $         68 => D         100 => d
37 => %         69 => E         101 => e
38 => &         70 => F         102 => f
39 => '         71 => G         103 => g
40 => (         72 => H         104 => h
41 => )         73 => I         105 => i
42 => *         74 => J         106 => j
43 => +         75 => K         107 => k
44 => ,         76 => L         108 => l
45 => -         77 => M         109 => m
46 => .         78 => N         110 => n
47 => /         79 => O         111 => o
48 => 0         80 => P         112 => p
49 => 1         81 => Q         113 => q
50 => 2         82 => R         114 => r
51 => 3         83 => S         115 => s
52 => 4         84 => T         116 => t
53 => 5         85 => U         117 => u
54 => 6         86 => V         118 => v
55 => 7         87 => W         119 => w
56 => 8         88 => X         120 => x
57 => 9         89 => Y         121 => y
58 => :         90 => Z         122 => z
59 => ;         91 => [         123 => {
60 => <         92 => \         124 => |
61 => =         93 => ]         125 => }
62 => >         94 => ^         126 => ~
63 => ?         95 => _         127 => 

Строка как символьный массив

Строка в С++ – это статический массив символов, в котором последний элемент имеет значение '\0' (нулевой символ). Т. е., это тот же C-массив со всеми его недостатками.

Не путать с символом '0'! В кодовой таблице ASCII нулевой символ (иначе NULL) находится на самой первой позиции, а именно – нулевой, откуда и название.

Это значение является признаком конца строки. Символьный массив не является строкой, если он не заканчивается нулевым символом. Строка является массивом фиксированного размера. Способ инициализации строки как массива является неудобным:

char str1[] {'T', 'h', 'i', 's', ' ', 's', 't', 'r', 'i', 'n', 'g', '!', '\0'};

Инициализировать строку можно более простым способом, заключив её в двойные кавычки:

char str2[] = "This string!";

Си-строки, подобно Си-массивам, нельзя сравнивать, нельзя присваивать значения элементов одного массива другому массиву по имени. Хотя для работы с Си-строкой STD предоставляет большой набор специальных функций (из стандартной библиотеки языка Си), тем не менее, работа со строкой как статическим массивом является небезопасной и неудобной.

Класс string

Стандартная библиотека языка С++ включает класс последовательного контейнера string, предназначенного для работы с символьными массивами. Инструментарий класса string более чем достаточен, чтобы не прибегать к функциям, работающим со строкой в стиле Си (т. е. содержит аналогичные функции). Си-строки автоматически преобразуются в строки типа string. В строках типа string завершающий символ не добавляется в массив, но может содержаться в массиве, как и любой другой символ. Для работы с контейнером string стандартная библиотека предоставляет полный набор функций и операций, общий для всех контейнеров. Например, итераторы, операции сравнения, функции для работы с размером и прочие. Начиная с C++17 для работы с классом string заголовок включать необязательно (нужно только заявить об использовании имен стандартной библиотеки).
Объявление переменных типа string (создание экземпляра класса) не отличается от объявления переменных других типов:

string myStr;

Здесь создается пустая строка myStr.
Инициализировать объекты класса string можно различными способами.

Инициализация во время объявления
string myStr("Это первая строка.");
Объявление с присваиванием
string myStr = "Это вторая строка.";
Копирование другой строки (othe_Str может быть Си-строкой или объектом класса string)
string myStr(other_Str);
Копирование из диапазона [pos, pos+count)
string myStr(other_Str, pos, count);
Заполнение определенными элементами
string myStr(20, 'a');
Копирование из диапазона, определенным итераторами [first, last)
string myStr(first, last);

Объект класса string как динамический массив

Объект класса string является динамическим массивом, во всем подобный vector. Всё, что было сказано относительно контейнера vector, в равной степени будет относится и к контейнеру string, поэтому мы не будем ниже останавливаться на общих методах контейнеров. Подробно мы остановимся только на методах вставки и удаления. Остальные методы используются аналогично.
Например, вставка и удаление символов в конце массива осуществляется методами push_back() и pop_back(), соответственно. Эти операции имеют такую же эффективность, как и для контейнера vector. Метод push_back() позволяет произвести “сборку строки” по определенным критериям. Рассмотрим задачу.
Задача 3. Дано четное число N (> 0) и символы C1 и C2. Вывести строку длины N, которая состоит из чередующихся символов C1 и C2, начиная с C1.

Программа 9.7.3
#include <iostream>
using namespace std;

int main() {
	char C1, C2;
	int N;
	string S; // пустая строка
	cout << "C1 = "; cin >> C1;
	cout << "C2 = "; cin >> C2;
	cout << "N  = "; cin >> N;
	for (int i = 0; i < N; i++) {
		if (i % 2 == 0)
			S.push_back(C1);
		else
			S.push_back(C2);
	}
	cout << S << endl;
	return 0;
}

Вывод

C1 = a
C2 = b
N  = 20
abababababababababab

Ввод и вывод объектов класса string

Вывод строки типа string осуществляется с помощью потокового объекта вывода на стандартное устройство cout, как обычные переменные. Для завершения вывода строки обязательно должен использоваться манипулятор endl. Вводить строку содержащую пробелы с помощью потокового объекта cin нельзя, так как ввод прервется после обнаружения в потоке первого пробельного символа. Пробельный символ расценивается как нулевой символ. К пробельным символам относятся: символ пробела ' ', а также '\t', '\v', '\r', '\n' и '\f'.
Для ввода строки типа string целиком, включая пробельные символы, необходимо использовать функцию getline(). Синтаксис этой функции таков:

getline (istream, str, delim);

где istream – это потоковый объект (если вывод осуществляется на экран, то в качестве потокового объекта используется cin), str – объект класса string, куда будет помещена строка, а delim – это символ разделитель (необязательный аргумент, по умолчанию используется '\n').
Использовать пробельные символы при вводе строки стандартным потоковым объектом можно с пользой. Вспомните задачу (программа 9.4.6) в которой мы получали массив строк, путем посимвольного анализа строки. Тогда мы пообещали разработать алгоритм получения массива слов другим способом – с помощью операций потока ввода. Выполняем обещанное! Такая задача может быть реализована следующим образом.

Программа 9.7.4
#include <iostream>
#include <vector>
using namespace std;

int main() {
    string S;
    vector<string> words;
    while (cin && cin.get() != '\n') {
        cin >> S;
        words.push_back(S);
    }
    //...
    // Решение задачи
    //...
    return 0;
}

Разберем выражение в заголовке цикла:

cin && cin.get() != '\n'

Чтобы его понять, необходимо знать как работает поток. Мы выше сказали, что из потока в строку будут считаны символы до первого попавшегося пробельного символа. Тем не менее, оставшиеся данные из потока не удаляются, они стоят в потоке на очереди! Следовательно, мы можем продолжить их чтение, что мы и делаем в цикле. В выражении условия мы проверяем, во-первых, что поток не пустой, во-вторых, что встретился завершающий символ. Завершающий символ будет находится в потоке в любом случае, но операция >> его не считывает и, если мы не проверим, что достигли конца строки, цикл не завершит свою работу.
Как видите, такой вариант значительно проще в реализации.

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

В таблице 2 перечислены функции класса string для обработки строк. Этих функций в других контейнерах нет. Заметим, что объекты класса string могут быть элементами другого контейнера, например vector. В таблице не показаны общие методы c контейнером vector.

Таблица 2. Методы и функции класса string для работы со строкой
Функция Описание
compare метод, сравнивает две строки
replace метод, заменяет указанную часть строки
erase, erase_if функция, удаляет из контейнера равные элементы или элементы по критерию (метод erase тоже присутствует)
substr метод, возвращает подстроку
copy метод, копирует символы
find, rfind метод, находит первый или последний символ или подстроку
getline функция, считывает неформатированные данные из потока в строку
stoi, stol, stoll, stoul, stoull функция, преобразует строку в целый тип
stof, stod, stold функция, преобразует строку в действительный тип
to_string функция,преобразует целый или действительный тип в строку

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

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

Для доступа к отдельному символу строки применяются либо операция обращения по индексу [], либо метод at() (например, myStr.at(i)). При этом используется обычный цикл for. Если строка не изменяет своего размера, то можно использовать диапазонный цикл for.
Задача 4. Дана строка латинских символов. Определить количество слов в данной строке, если считать, что каждое слово в этой строке разделяется от другого только одним пробелом.

Программа 9.7.5
#include <iostream>
using namespace std;

int main() {
    cout << "Введите строку =>";
    string S;
    getline(cin, S);
    int j = 0;
    for (auto r : S)
        if (r == ' ')
            ++j;
    cout << "Слов в строке S: " << ++j << endl;
    return 0;
}

Вывод

Введите строку => Id agas, ut sis felix, non ut videaris.        
Слов в строке S: 8
Лат. “Поступай так, чтобы быть счастливым, а не казаться”. (Сенека)
Конкатенация. Метод append()

В операции конкатенации (лат. concatenatio – «сцепление») происходит объединение строк. В этих операциях могут участвовать, наряду с объектами класса string, строковые литералы, одиночные символы и C-строки.

Если объекту класса string производится попытка присвоить значение конкатенации литералов (в конкатенации не участвуют объекты класса string), то это приведет к ошибке.

Для конкатенации применяется функция operator+ и опреация operator+=. Например:

string S1 = "Это";
string S2 = "новая";
string S3 = "строка";
string new_S = S1 + " " + S2 + " " + S3;
new_S += '!';
cout << new_S << endl;
// Результат:
// Это новая строка!

Операция "+=" лаконична, но метод append() гибче, так как позволяет добавлять элементы разнообразными способами. Для добавления символов, объектов string, string_view, C-строки или списка инициализации можно использовать как operator+=, так и метод append(). Метод append() имеет дополнительно следующие варианты использования (перегрузки):

myStr.append(other_str, pos, count);
myStr.append(С-str, count);
myStr.append(firs, last);
myStr.append(count, char); 
  1. Добавляет подстроку из строки other_str в промежутке [pos, pos + count);
  2. Добавляет count символов C-массива C-str;
  3. Добавляет подстроку, определённую итераторами first и last;
  4. Добавляет count символов char;

Задача 5. Дана непустая строка S и целое число N (> 0). Вывести строку, содержащую символы строки S, между которыми вставлено по N символов ch (вводится с клавиатуры).

Программа 9.7.6
#include <iostream>
using namespace std;

int main() {
    cout << "Введите строку: ";
    string S, S2;
    getline(cin, S);
    char ch;
    cout << "Введите символ: ";
    cin >> ch;
    int N;
    cout << "N = "; cin >> N;
    string tmp;
    for (int i = 0; i < N; i++)
        tmp += ch;
    for (size_t i = 0; i < S.size(); i++)
        S2.append(S.at(i) + tmp);
    cout << S2 << endl;
    return 0;
}

Вывод

Введите строку: 
qqqqqqqqqqqqqq
Введите символ: 
*
N = 3
q***q***q***q***q***q***q***q***q***q***q***q***q***q***
Поиск символов

Для поиска символов в строке используется метод find(), который находит первую подстроку, равную переданной строке, подстроке или символу, начиная с позиции pos. В качестве подстроки может выступать символы, объекты string, string_view или C-строка.

myStr.find(str, pos);
myStr.find(C-str, pos, count);
myStr.find(C-str, pos);
myStr.find(char, pos);

Метод возвращает позицию первого символа найденной подстроки или npos, если подстрока не найдена.
npos - это специальное значение (константа класса string), равное максимальному значению, которое может предоставить тип size_type. Точный смысл данного значения зависит от контекста, но, как правило, оно используется либо как индикатор конца строки в функциях, которые ожидают позицию символа, либо как индикатор ошибки в функциях, которые возвращают позицию в строке.
Если поиск удобнее осуществлять с конца файла, то используется метод rfind(), полностью аналогичный методу find().
Задача 6. Дана строка S. Определить сколько раз строка S0 входит в строку S. Если подстроки S0 нет в строке S, то вывести 0.

Программа 9.7.7
#include <iostream>
using namespace std;

int main() {
    string S, S0;
    cout << "Введите строку: ";
    getline(cin, S);
    cout << "Введите подстроку: ";
    getline(cin, S0);
    size_t pos = 0, j = 0;
    if (S.find(S0) == string::npos)
        cout << pos << endl;
    else
        while (S.find(S0, pos) != string::npos){
            j++;
            pos = S.find(S0, pos) + S0.size() - 1;
        }
    if (pos)
        cout << j << endl;
    return 0;
}
Введите строку: qqqqqqqqqqwwqqqqqqqqqqqwwqqqqqqqqqqqqqqww
Введите подстроку: ww
3
Удаление символов

Удаление символов осуществляется с помощью метода erase() и функций erase() и erase_if()

myStr.erase(index, count);
erase(myStr, value);
erase_if(myStr, pred);

Метод удаляет min(count, size() - index) символов, начиная с позиции index. Метод возвращает ссылку на myStr.
Функции (добавлены в стандарте C++20) удаляют в контейнере элементы, равные value или элементы, для которых предикат (унарная логическая функция) возвращает значение true. Возвращают количество удаленных элементов.
Метод erase имеет перегрузки в которых аргументами являются итераторы:

myStr.erase(const_it pos);
myStr.erase(const_it first, const_it last);
  1. Удаляет символ в позиции итератора; возвращает итератор указывающий на символ, следующий за последним удаленным символом или end(), если такого символа не существует.
  2. Удаляет символы в диапазоне [first, last); возвращает итератор, указывающий на символ, на который он указывал перед стиранием, или end().

Задача 7. Дана строка S. Удалить из этой строки все повторяющиеся символы, следующие друг за другом, оставив только по одному символу.

Программа 9.7.8
#include <iostream>
using namespace std;

int main() {
    cout << "Введите строку: ";
    string S;
    getline(cin, S);
    size_t i = 0;
    while (i < S.size())
        if (S[i] == S[i + 1])
            S.erase (i, 1);
        else
            i++;
    cout << S << endl;
    return 0;
}

Вывод

Введите строку: 
qqqqqqqqqqwwwwwwwweeeeeerrrrttyui
qwertyui
Вставка символов или подстрок

Для вставки подстроки в данную строку используется метод insert(). Перегрузки метода:
Этот метод имеет большое количество перегрузок. Перегрузки возвращающие ссылку на объект:

myStr.insert(index, count, ch);
myStr.insert(index, str);
myStr.insert(index, str, count);
myStr.insert(index, str, index_str, count);
  1. Вставка count символов ch в позицию index;
  2. Вставка строки str (str - объект string или С-строка) в позицию index;
  3. Вставка диапазона [str, str+count) в позицию index;
  4. Вставка подстроки str.substr(index_str, count) в позицию index;

Перегрузки ниже возвращают итератор в позиции следующей за последним вставленным символом.

myStr.insert(it, ch);
myStr.insert(it, count, ch);
myStr.insert(it, first, last);
myStr.insert(it, first, ilist);
  1. Вставляет символ ch;
  2. Вставляет count символов ch;
  3. Вставляет диапазон [first, last);
  4. Вставляет список инициализации.

Задача 8. Дана строка S. Удвоить каждое вхождение символа 'w' в этой строке.

Программа 9.7.9
#include <iostream>
using namespace std;

int main() {
    cout << "Введите строку: ";
    string S;
    getline(cin, S);
    size_t pos = 0;
    while (S.find('w', pos) != string::npos){
        pos = S.find('w', pos);
        S.insert(pos, 1, 'w'); // вставка осуществляется в эту позицию
        pos += 2; // поэтому нужно "перешагнуть" продублированный элемент
    }
    cout << S << endl;
    return 0;
}

Вывод

Введите строку: 
qqqqwwqqqqwqqqqww
qqqqwwwwqqqqwwqqqqwwww
Замена подстроки на другую подстроку или строку

Если нужно заменить какую-либо подстроку в текущей строке на другую, то применяется метод replace(). Подстрока замены не обязательно должна иметь тот же размер, что и заменяемая подстрока. Перегрузки данного метода:

myStr.replace(pos, count, other_str);
myStr.replace(pos, count, other_str, pos2, count2);
myStr.replace(first, last, other_str);
myStr.replace(first, last, first2, last2);
myStr.replace(first, last, C-str, count);
myStr.replace(first, last, count, char);
myStr.replace(pos, count, count2, char);
myStr.replace(first, last, ilist);
1, 2. Заменяет подстроку, указанную диапазоном [pos, pos + count), на строку other_str (или диапазоном).
1, 3. other_str может быть объектом класса string, C-строкой или string_view.
2. other_str может быть объектом класса string или string_view.
3, 4, 5, 6, 8. Заменяет в текущей строке подстроку, взятую итераторами [first, last), на other_str, другим диапазоном [first2, last2); count символами ([С-str, С-str + count)) массива C-str; count символами char или списком инициализации ilist.
7. Заменяет подстроку, указанную диапазоном [pos, pos + count) на count2 символов char.

Задача 9. Дана строка S. Заменить каждое вхождение подстроки S0 на подстроку S1. Гарантируется, что подстрока S0 есть в строке S.

Программа 9.7.10
#include <iostream>
using namespace std;

int main() {
    string S, S0, S1;
    cout << "Введите строку S: ";
    getline(cin, S);
    cout << "Введите подстроку S0: ";
    getline(cin, S0);
    cout << "Введите строку замены S1: ";
    getline(cin, S1);
    size_t pos(0);
    while (S.find(S0, pos) != string::npos){
        pos = S.find(S0, pos);
        S.replace(pos, S1.size(), S1);
        pos += S1.size () - 1;
    }
    cout << S << endl;
    return 0;
}

Вывод

Введите строку S: qqqqqqwwwwqqqqqqqqwwwwqqwww
Введите подстроку S0: wwww
Введите строку замены S1: sss
qqqqqqssswqqqqqqqqssswqqwww
Методы копирования

К методам копирования относятся:

  • copy()
  • substr()
  • swap()
Метод copy() копирует подстроку, заданную диапазоном [pos, pos + count), в строку символов, на которую указывает other_str. pos не должен быть >= size().

myStr.copy(other_str, count, pos);

Метод substr() возвращает подстроку, следовательно, применяется в операциях с присваиванием или может быть использован как аргумент других методов и функций.

other_str = myStr.substr(pos, count);

Метод swap() позволяет обмениваться содержимым между двумя строками myStr и other_str.

myStr.swap(othe_str);

Задача 10. Даны целые положительные числа N1 и N2 и строки S1 и S2. Получить из этих строк новую строку, содержащую первые N1 символов строки S1 и последние N2 символов строки S2 (в указанном порядке). Произвести обмен элементами между строками S1 и S2. Вывести измененные строки.

Программа 9.7.11
#include <iostream>
using namespace std;

int main() {
	string S1, S2, S3;
	size_t N1, N2;
	cout << "S1 => ";
	getline(cin, S1);
	cout << "S2 => ";
	getline(cin, S2);
	cout << "N1 = "; cin >> N1;
	cout << "N2 = "; cin >> N2;
	S3 = S1.substr(0, N1) +
	     S2.substr(S2.size() - N2, string::npos);
	S1.swap(S2);
	cout << "S3 => "
		 << S3 << "\n"
		 << "S1 => "
		 << S1 << "\n"
		 << "S2 => "
		 << S2 << endl;
	return 0;
}

Вывод

S1 => Latrante uno, latrat statim et alter canis
S2 => Nullum est jam dictum, quod non sit dictum prius
N1 = 16
N2 = 26
S3 => Latrante uno, la quod non sit dictum prius
S1 => Nullum est jam dictum, quod non sit dictum prius
S2 => Latrante uno, latrat statim et alter canis
Лат. "Когда лает одна, тотчас же лает и другая собака". "Ничего уже не говорят такого, чего не было сказано раньше."
Числовые преобразования

Для преобразования объекта класса string в числовые типы существует набор функций преобразования. Преобразования объекта класса string осуществляются в знаковое целое, беззнаковое целое и в число с плавающей точкой.
Функции, которые преобразуют строку в целое число со знаком:

stoi(str, pos, base)
stol(str, pos, base)
stoll(str, pos, base)

Функции имеет три аргумента:

  • str – строка для преобразования
  • pos – адрес переменной целочисленного типа для сохранения в ней индекса первого непреобразованного символа. Необязательный аргумент
  • base – основание системы счисления. Необязательный аргумент
Для оснований больше, чем 10, набор корректных цифр дополняется символами латинского алфавита, начиная с Aa для системы счисления с основанием 11, до Zz для системы счисления с основанием 36. Регистр символов значения не имеет. Например:

string S1("45");
string S2("65");
int d = stoi(S1) + stoi(S2);
cout << d << endl;

Функции, которые осуществляют аналогичные преобразования, но в беззнаковое целое: stoul(), stoull().
Функции, которые преобразуют строку в число с плавающей точкой:

stof(str, pos)
stod(str, pos)
stold(str, pos)

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

Программа 9.7.12
#include <iostream>
using namespace std;

int main() {
	string S1 = "10000";
	string S2 = "10.2";
	cout << stoi(S1) * 2 << endl;
	cout << stod(S2) / 5 << endl;
	return 0;
}

Вывод

20000
2.04

Приложение

Примеры решения задач
Вопросы
Темы сообщений
Задания А
Задания Б
Задания С
Ссылки
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.


Обсуждение закрыто.