Необходимо отделить числа от строки в строке, разделенной ';', (25; 16; 67; 13) в c ++ - PullRequest
1 голос
/ 14 марта 2020

У нас есть строка (25;16;67;13;14;.......)

Нам нужно распечатать числа отдельно. Последнее число не имеет точку с запятой.

Вывод должен выглядеть примерно так:

25
16
67
13
14
......

Предполагается, что мы используем str.find, str.substr и size_t переменные current_pos, prev_pos, каково будет состояние while l oop, которое мы используем для просмотра строки, чтобы она печатала все числа, а не только первое?

Ответы [ 4 ]

1 голос
/ 15 марта 2020
using namespace std;
int main() {
string a{ "1232,12312;21414:231;23231;22" };
for (int i = 0; i < a.size(); i++) {
    if (ispunct(a[i])) {
        a[i] = ' ';
    }
}
stringstream line(a);
string b;
while (getline(line, b, ' ')) {
    cout << b << endl;

}

} // любая пунктуация ", / ;: <> ="

1 голос
/ 14 марта 2020

Если вам нужно только напечатать числа в строке (а не представить их в структурах данных), решение довольно простое. Просто прочитайте всю строку, а затем напечатайте ее символ за символом. Если символ является точкой с запятой, вместо этого выведите новую строку.

#include <iostream>
#include <string>

using namespace std;

int main(){
    string input;
    cin >> input;
    for(int i = 0; i < input.length(); i++){
        if(input.at(i) == ';') cout << endl;
        else cout << input.at(i);
    }
}
1 голос
/ 14 марта 2020

Вы можете использовать std::istringstream:

#include <sstream>
#include <iostream>

int main() {

    std::string text("25;16;67;13;14");
    std::istringstream ss(text); 
    std::string token;

    while(std::getline(ss, token, ';'))
    {
        std::cout << token << '\n';
    }

    return 0;
}

Запуск вышеуказанного кода онлайн приводит к следующему выводу:

25
16
67
13
14
0 голосов
/ 15 марта 2020

Я дам вам точный ответ на ваш вопрос с примером и альтернативным решением с однострочником.

См.

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <regex>

const std::regex re(";");

int main() {

    std::string test("25;16;67;13;14;15");

    // Solution 1: as requested
    {
        size_t current_pos{};
        size_t prev_pos{};
        // Search for the next semicolon
        while ((current_pos = test.find(';', prev_pos)) != std::string::npos) {

            // Print the resulting value
            std::cout << test.substr(prev_pos, current_pos - prev_pos) << "\n";
            // Update search positions
            prev_pos = current_pos + 1;
        }
        // Since there is no ; at the end, we print the last number manually
        std::cout << test.substr(prev_pos) << "\n\n";
    }

    // Solution 2. All in one statement. Just to show to you what can be done with C++
    {
        std::copy(std::sregex_token_iterator(test.begin(), test.end(), re, -1), {}, std::ostream_iterator<std::string>(std::cout, "\n"));
    }
    return 0;
}
...