【问题标题】:C++ Reading fixed number of lines of integers with unknown number of integers in each lineC ++读取固定数量的整数行,每行中的整数数量未知
【发布时间】:2013-02-12 02:01:25
【问题描述】:

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

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);
}

【问题讨论】:

  • 你试过用调试器找出为什么它不起作用吗?
  • “不起作用”到底是什么意思?
  • 编译器没有消息我得到了输出
  • t 是一个未定义的值
  • 现在尝试在enter 键之前输入一行以空格 结尾的数字。

标签: c++ dev-c++


【解决方案1】:

C++ 为您提供了许多工具:

  • string 是一个管理字符串生命周期的类。
  • getline 将流中的一行(直到下一个换行符)放入 string
  • istringstreamstring 中生成 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';
}

【讨论】:

    【解决方案2】:

    sum=0; // 在顶部

    ps

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

    【讨论】:

    • cin.peek()!='\n' 是的,但是 SPOJ 上的编译器通常不会得到它,所以我必须使用 while(true)
    【解决方案3】:

    使用getline 一次读取一行到std::string 类型的对象。然后使用该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
    • 有没有额外的东西(字符串)的解决方案?
    • 这是惯用的 C++,其他任何东西都不是最理想的。
    • @Qbik - 当然,如果你喜欢复杂的代码。 &lt;g&gt; 必须解析面向行的输入是很常见的,这种方法简单有效。
    • @Qbik 管理循环是错误的常见来源。你实际上必须通过你的代码来了解它在做什么。你有一个while(true) - 你确定break 会发生吗?如果最后一行没有换行符怎么办?此外,引用的非本地性意味着需要时间来了解 sumx 之间的关系。
    猜你喜欢
    • 2023-03-04
    • 2013-11-09
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多