首页 > 解决方案 > 为什么这段代码没有给出想要的输出?

问题描述

#include <sstream>
#include <vector>
#include <iostream>
using namespace std;

vector<int> parseInts(string str) {
    istringstream ss(str);
    vector<int> integ;
    int val;
    while(ss){

        if(ss>>val){
            integ.push_back(val);
        }
    }

    return integ;
}
vector<int> parseInts2(string str) 
{
    vector<int> vec;    
    stringstream ss(str); 
    char ch;
    int temp;

    while(ss)   
    {
        ss>>temp>>ch;   >> operator
        vec.push_back(temp);   
    } 

    return vec; 
}
int main() {
    string str;
    cin >> str;
    vector<int> integers = parseInts(str);
    for(int i = 0; i < integers.size(); i++) {
        cout << integers[i] << "\n";
    }

    return 0;
}

我想创建一个流,到一个字符串,从字符串中读取整数到流中,并将其插入一个向量并在输出不显示任何内容时显示它的元素。代码有什么问题?

编辑

基本上,问题以逗号分隔的整数形式询问输入,并要求我们在解析后打印整数。我发现这两个函数之间没有显着差异,但 parseInt2 仍然有效(在 main 中调用函数时,当然不是 parseInt)。为什么?

标签: c++stringstream

解决方案


我担心你的问题会被 SO 上的人关闭。

但让我给你答案。

基本上所有的东西都已经在评论中设置好了。为什么不在答案中?我不知道。

在从 中读取某些内容之前std::istringstream,您需要在其中放入一些内容。你需要初始化它。这通常是通过使用它的构造函数来完成的:

istringstream ss(str);

主要问题是,您只从std::cinwith中读取了一个值cin >> str;。您想std::getline改用它,它读取完整的行。而不仅仅是“东西”到下一个空间。所以

getline(cin, str);

将进一步帮助您。

在现代 C++ 中,保持这种std::istringstream方法,你可能会写

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <sstream>

int main() {

    // Read a line and check, if that worked
    if (std::string str; std::getline(std::cin, str)) {

        // Create and initialize a std::istringstream
        std::istringstream iss(str);

        // Define a variable integers, use its range constructor with iterators
        std::vector integers(std::istream_iterator<int>(iss), {});

        // Range based for loop
        for (const int& i : integers) {
            std::cout << i << "\n";
        }
    }

    return 0;
}

这将保存子功能。


编辑:

好的,你要阅读 csv,你必须使用“>>”。

如果要从流中读取以逗号分隔的数据,则需要提取:

  • 流中的整数值
  • 然后是逗号
  • 然后是一个整数
  • 然后是逗号
  • 然后是一个整数
  • . . .

提取器运算符或其背后的功能总是从流中提取字符并将其转换为请求的类型(例如整数),直到它到达空格或转换不能再继续(例如,“ , 是分隔符)。

这就是为什么您的第二个功能起作用的原因。

务必检查提取操作的状态。在下面的示例中,您将看到,在字符串的末尾,我们尝试读取没有逗号的逗号。提取失败,但我们不在乎。我们故意忽略它。要更好地了解功能,请参阅。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

int main() {
    // Source or test data. We put it directly into the stream;
    std::istringstream ss{ "1,2,3,  4  ,  5,6" };
    std::vector<int> integers{};
    char comma{};
    int integer{};

    while (ss)  {

        // Read integer and check, if it could be read
        if (ss >> integer) {
            integers.push_back(integer);
            std::cout << "Read Integer " << integer << "\n";
        }
        else 
            std::cerr << "Error: Could not read integer\n";

        // Now read the comma
        if (ss && (ss >> comma))
            std::cout << "Read Comma: " << comma << "\n";
        else
            std::cerr << "Error: Could not read comma\n";
    }
    // SHow all values
    for (const int i : integers) std::cout << i << "\n";

    return 0;
}

如果您有任何问题,我很乐意回答。


推荐阅读