如何读取输入用空格分隔的几行整数(在C ++中)?

时间:2018-11-11 11:21:15

标签: c++ atoi

所以有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 :(得分:1)

#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
}

答案 1 :(得分:0)

如果您需要面向行的解析并且仍想使用iostream的功能,那么我建议您使用std::getlinestd::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";
}