【问题标题】:Using stringstream to read integers and add them up使用 stringstream 读取整数并将它们相加
【发布时间】:2020-10-08 00:46:51
【问题描述】:

我正在尝试使用字符串流来输出使用字符串流在标准输入的每一行中的整数之和。这就是我目前所拥有的

void sumvec(vector<int> v) {
    int total = 0;
    for (int i = 0; i < v.size(); i++) {
           total += v[i];
    }
    cout << total << endl;
}

int main()
{
    std::vector<int> v;
    std::string line;
    std::stringstream sstream(line); 
    int i;
    while (getline(std::cin, line)){
        while (sstream >> i) { 
            v.push_back(i); 
        }
        sumvec(v);
    }

}

我希望每一行都有自己的总和。但是当我这样做时,没有任何东西被返回到输出中。任何帮助将不胜感激。

【问题讨论】:

  • std::stringstream sstream(line); 构造一个字符串流,当前内容为line。它不会在字符串流和line 之间创建某种链接,因此如果您写入line,字符串流将自动更新。仅在需要时才声明变量,这样这样的错误就会减少。 sstream 应该在第一个 while 循环内。
  • 了解如何使用调试器。当您使用调试器单步执行代码时,此类错误非常明显。
  • std::string line; while (getline(std::cin, line)) { std::stringstream sstream(line); while (sstream &gt;&gt; i) { ...

标签: c++ stdout stdin stringstream


【解决方案1】:

sstream在第二个while中使用时为空:while (sstream &gt;&gt; i)。那是因为您使用空的std::string line; 对其进行了初始化。您可以将其移动到第一个 while 循环中:

while (getline(std::cin, line)){
    std::stringstream sstream(line);

这将修复您的代码。

一些改进代码的建议:

此外,始终初始化您的变量,因此 int i 应该是 int i = 0;int i{};

您似乎只是从标准输入读取到line,然后将其转换为int。您可以使用 std::stoi() 而不是 stringstream,这在这种情况下可能就足够了。

sumvec 包含一个原始循环,用于添加vector 的所有元素。您可以改为使用 std::accumulate 来执行此操作。示例:

int total = std::accumulate(v.begin(), v.end(), 0);
cout << total << endl;

如果您仍想使用sumvec,请确保改为通过引用传递向量。这将避免复制,从而获得更好的性能,并且您将保证v 在此功能中不会更改。它也让读者清楚这个函数的作用。

void sumvec(const vector<int>& v) {

另外,在你的循环中

for (int i = 0; i < v.size(); i++)

您将size_tint 进行比较。 size_t 属于unsigned,而int 不是。尽可能避免这种情况。而是使用size_t:

for (size_t i = 0; i < v.size(); i++)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多