Как прочитать ввод нескольких строк целых чисел, разделенных пробелами (в C ++)? - PullRequest
0 голосов
/ 11 ноября 2018

Итак, есть Q строк. В каждой строке есть произвольное число целых чисел, разделенных пробелами, мне нужно обработать эти числа.

Пример ввода

Q = 4
12 32 4 3 2
1 2 3 4 
0
2 3 1 223 4 2 3

Я читаю каждую строку как строку и извлекаю числа в виде строки, а затем использую atoi для преобразования их в int, т.е.

while(Q>0){
        for(char c:s){
            if (c==' '){
                int x = atoi(temp.c_str());
                temp = "";
                //process x
                continue;
            }
            temp +=c;
        }
        Q--;
    }

Конечно, есть лучший способ сделать это?

Редактировать: номера каждой строки обрабатываются по-разному.

Например, скажите

Строка 1 имеет 1,2,3,4. Строка 2 имеет 14,15.

Тогда 1,2,3,4 будут обрабатываться по-разному, а 13,14 - по-разному.

Вот почему я не могу использовать std :: cin, поскольку он игнорирует все пробелы (как пробелы, так и перевод строки).

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Если вам нужен линейно-ориентированный синтаксический анализ и вы все еще хотите использовать мощь iostream, тогда я предлагаю вам использовать std::getline и std::istringstream. Пример ниже

#include <iostream>
#include <sstream>

int main() {
    char ch = '\0';
    std::cin >> ch;
    if (!std::cin || ch != 'Q') return EXIT_FAILURE;
    std::cin >> ch;
    if (!std::cin || ch != '=') return EXIT_FAILURE;
    int Q = 0;
    std::cin >> Q;
    if (!std::cin) return EXIT_FAILURE;
    std::string line;
    std::getline(std::cin, line); // get ready for a new line
    while (Q > 0) {
        if (!std::getline(std::cin, line)) return EXIT_FAILURE;
        std::istringstream iss(line);
        int count = 0;
        int sum = 0;
        int i;
        while (iss >> i) {
            ++count;
            sum += i;
        }
        std::cout << "Found " << count << " integers who's sum was " << sum << '\n';
        Q--;
    }
    std::cout << "Done\n";
}
0 голосов
/ 11 ноября 2018
#include <iostream>

// ...

int x;
while (std::cin >> x)
    ; // process x

отредактировано причина вашего комментария:

#include <iostream>

// ...

int x;
char ch;
while (std::cin >> x >> std::noskipws >> ch >> std::skipws) {
    if (ch == '\n')
        ; // process x differently
}
...