C++读取未知整数行固定数量的整数

3

我正在尝试读取数据并解决简单问题,数据如下:

3               - number of lines to read in
1 1
2 2 2
3 4 

在输入每行数据后,我希望获得输入数字的总和,但是每行中整数的数量是未知的。使用上述数据后,屏幕应该如下所示:

3               
1 1
Sum: 2
2 2 2
Sum: 6
3 4 
Sum: 7

但是从我的算法中,我得到了如下输出:
3
1 1
Sum: 1
2 2 2
Sum: 4
3 4
Sum: 3

我已经编写了代码,但它不能正常工作(如上所示): 修改版
我改进了我的代码并知道它能够正常工作,没有字符串等,正确的代码如下:

#include<iostream>
using namespace std;
int main()
{
    int x;
    int t, sum;
    cin >> t;

    for(int i=0; i<t; i++) {
        sum=0;
        while(true)
        {
            cin >> x;
            sum = sum + x;  
            if(cin.peek()=='\n')
                break; //conditional break
        }
        cout << "Sum: " << sum << "\n";
    }
    return(0);
}

“doesn't work” 意味着什么? - Mats Petersson
编译器没有任何提示信息,我已经获得了输出。 - Qbik
t是一个未定义的值。 - QuentinUK
2
现在尝试输入以空格结尾的数字行,然后按enter键。 - Pete Becker
@Pete Becker 是的,我知道 :) - Qbik
显示剩余2条评论
3个回答

5

使用getline逐行读取文本内容,将其存储为std::string对象。然后使用该对象初始化std::istringstream对象,并使用提取器从流对象中读取int值,直到读取失败。接着,回到上一行,再次进行相同的操作。大致如下:

std::string line;
while (std::getline(std::cin, line)) {
    std::istringstream in(line);
    int sum = 0;
    int value = 0;
    while (in >> value)
        sum += value;
    std::cout << sum << '\n';
}

或者使用 std::accumulate - Peter Wood
有没有不需要额外东西(字符串)的解决方案? - Qbik
这是惯用的C++写法,其他方式都不够优秀。 - Peter Wood
@Peter Wood,我的解决方案是否不够优秀?我已经改进了它,现在它可以正常工作了。 - Qbik
1
@Qbik - 当然可以,如果你喜欢复杂的代码。<g> 解析基于行的输入是非常常见的,这种方法简单而有效。 - Pete Becker
1
@Qbik 管理循环是错误的常见来源。你必须跟踪代码才能理解它在做什么。你有一个 while(true) - 你确定 break 会发生吗?如果最后一行没有换行符怎么办?此外,引用的非局部性意味着需要时间来理解 sumx 的关系。 - Peter Wood

1

C++给你很多工具:

  • string 是一个管理字符字符串寿命的类。
  • getline 从流中获取一行数据(直到下一个换行符),并将其存入string中。
  • istringstream 将一个string转换为一个istream
  • istream_iterator 遍历一个istream,提取给定类型,在空格处断开。
  • accumulate 接受迭代器限定范围,并将值相加:

总之:

string line;
while (getline(cin, line)) {
    istringstream in(line);
    istream_iterator<int> begin(in), end;
    int sum = accumulate(begin, end, 0);
    cout << sum << '\n';
}

0

放置

sum=0; // 放在顶部

附言

while(cin.peek()!='\n'){


}

cin.peek()!='\n' 是正确的,但是在SPOJ编译器上通常无法理解,所以我不得不使用 while(true) - Qbik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接