C ++ Получение нескольких строк из строки - PullRequest
0 голосов
/ 08 октября 2018

Одно из моих заданий включает чтение нескольких строк в моей программе.Я понял, как хранить строки в одной, но теперь мне нужно извлекать каждую строку построчно.Какие-либо предложения?Пример:

string s = "Hello
            Welcome
            Oranges
            Bananas
            Hi
            Triangle"

Мне также не разрешено хранить их в массиве;все они должны содержаться в одной строке.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Чтобы отобразить std::string содержимое как есть , используйте необработанный строковый литерал .Следующий код извлекает все отдельные строки из необработанного строкового литерала:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

int main() {
   std::string s = R"x(Hello
Welcome
Oranges
Bananas
Hi
Triangle (and hey, some extra stuff in the line with parenthesis)
)x"; 
    std::istringstream iss(s); 
    std::vector<std::string> lines; 
    std::string line; 
    while(getline(iss,line)) { 
        lines.push_back(line); 
    }
    for(const auto& line : lines) {
        std::cout << line << '\n';
    }
}

См. Рабочую версию онлайн здесь .


С предыдущим C ++11 стандартов, вам придется избегать разрывов строк с помощью символа \, например, так:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

int main() {
   std::string s = "Hello \n\
Welcome \n\
Oranges \n\
Bananas \n\
Hi  \n\
Triangle (and hey, some extra stuff in the line with parenthesis)"; 
    std::istringstream iss(s); 
    std::vector<std::string> lines; 
    std::string line; 
    while(getline(iss,line)) { 
        lines.push_back(line); 
    }
    for(std::vector<std::string>::const_iterator it = lines.begin(); it != lines.end(); ++it) {
        std::cout << *it << '\n';
    }
}

См. Другой работающий онлайн-пример .

0 голосов
/ 08 октября 2018

Я бы, вероятно, поместил бы строку в поток строк, а затем использовал бы что-то вроде std::getline для чтения строки за раз из потока строк.Если вы действительно беспокоитесь о скорости выполнения, есть более быстрые способы, но это будет очевидным первым выбором, пока профилирование не скажет вам, что это недопустимо.

Для чего стоит встроить новую строкув строку, вы можете использовать либо \n, либо переключиться на использование строкового литерала:

string s = R"(Hello
              Welcome
              Oranges
              Bananas
              Hi
              Triangle)";

С необработанным строковым литералом, встроенные новые строки (и все остальное) становятся частью строкисам.В обычном строковом литерале вы должны использовать \n вместо этого (если вы хотите, чтобы он был переносимым, в любом случае).

...