Решение 1: Просто удалить "\n"
из строки.
Просто чтобы удалить "\n"
, вы можете использовать erase-remove idiom . СМОТРИТЕ ЗДЕСЬ ЗДЕСЬ
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string myString = "This is \n a test. Let's go on. \n Yeah.";
myString.erase(std::remove(myString.begin(), myString.end(), '\n'),
myString.end());
std::cout << myString<< std::endl;
}
Выход:
This is a test. Let's go on. Yeah
Решение 2 : удалить "\n"
из строки и сохранить каждое разбиение в \n
в вектор. (Ип-эффективный)
Заменить все вхождения \n
некоторыми другими символами, которых нет в строке (здесь я выбрал ;
). Затем выполните синтаксический анализ с помощью std::stringstream
и std::getline
следующим образом. СМОТРИТЕ ЗДЕСЬ ЗДЕСЬ
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <sstream>
int main()
{
std::string myString = "This is \n a test. Let's go on. \n Yeah.";
std::replace(myString.begin(), myString.end(), '\n', ';');
std::stringstream ssMyString(myString);
std::string each_split;
std::vector<std::string> vec;
while(std::getline(ssMyString, each_split, ';')) vec.emplace_back(each_split);
for(const auto& it: vec) std::cout << it << "\n";
}
Выход:
This is
a test. Let's go on.
Yeah.
Решение 3 : удалить "\n"
из строки и сохранить каждое разбиение в \n
в вектор.
Перебрать строку и найти позиции (используя std::string::find
), где \n
(конечная позиция) находит. Отодвиньте подстроки (std::string::substr
), используя информацию о начальной позиции и количестве указателей между начальной и конечной позицией. Каждый раз обновляйте начальную и конечную позиции, чтобы поиск не начинался снова с beging входной строки. СМОТРИТЕ ЗДЕСЬ ЗДЕСЬ
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstddef>
int main()
{
std::string myString = "This is \n a test. Let's go on. \n Yeah.";
std::vector<std::string> vec;
std::size_t start_pos = 0;
std::size_t end_pos = 0;
while ((end_pos = myString.find("\n", end_pos)) != std::string::npos)
{
vec.emplace_back(myString.substr(start_pos, end_pos - start_pos));
start_pos = end_pos + 1;
end_pos += 2;
}
vec.emplace_back(myString.substr(start_pos, myString.size() - start_pos)); // last substring
for(const auto& it: vec) std::cout << it << "\n";
}
Выход:
This is
a test. Let's go on.
Yeah.