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

C++ 如何读取由空格分隔的几行整数(在C+;+;)输入?,c++,atoi,C++,Atoi,所以有Q线。 每行都有一个由空格分隔的任意数量的整数,我需要处理这些数字 示例输入 我把每一行读成字符串,把数字提取成字符串,然后用atoi把它们转换成int while(Q>0){ for(char c:s){ if (c==' '){ int x = atoi(temp.c_str()); temp = ""; //process x

所以有Q线。 每行都有一个由空格分隔的任意数量的整数,我需要处理这些数字

示例输入

我把每一行读成字符串,把数字提取成字符串,然后用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,因为它会忽略所有的空格(空格和换行符)。

\include
// ...
int x;
而(标准::cin>>x)
; // 过程x

您发表评论的原因:

#include <iostream>

// ...

int x;
char ch;
while (std::cin >> x >> std::noskipws >> ch >> std::skipws) {
    if (ch == '\n')
        ; // process x differently
}
#包括
// ...
int x;
char ch;
而(std::cin>>x>>std::noskipws>>ch>>std::skipws){
如果(ch='\n')
;//以不同的方式处理x
}

如果您需要面向行的解析,并且仍然希望使用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";
}
#包括
#包括
int main(){
char ch='\0';
标准:cin>>ch;
如果(!std::cin | | ch!=“Q”)返回退出失败;
标准:cin>>ch;
如果(!std::cin | | ch!='=')返回退出失败;
int Q=0;
标准:cin>>Q;
如果(!std::cin)返回EXIT_失败;
std::字符串行;
std::getline(std::cin,line);//为新行做好准备
而(Q>0){
如果(!std::getline(std::cin,line))返回EXIT_失败;
标准::istringstream iss(线);
整数计数=0;
整数和=0;
int i;
while(iss>>i){
++计数;
总和+=i;
}

std::我能读每一行并用正则表达式进行解析吗。@RyanPierce Williams你能详细说明一下怎么做吗?你可以在每一行上使用这样的正则表达式:([\d]+)“要查找所有整数。请在此处尝试:是否存在不同处理方式的模式?默认情况下,cin会忽略所有空格。我需要分别处理属于每行的整数。示例行1:1 2 3 4行2:12 34此处1,2,3,4将以不同方式处理,12,34将以不同方式处理。抱歉,现在已修复此问题。
#include <iostream>

// ...

int x;
char ch;
while (std::cin >> x >> std::noskipws >> ch >> std::skipws) {
    if (ch == '\n')
        ; // process x differently
}
#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";
}