为什么这段代码没有给出期望的输出?

时间:2019-12-30 18:33:53

标签: c++ stringstream

#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)。为什么?

1 个答案:

答案 0 :(得分:5)

我担心您的问题会被SO上的人解决。

但是让我给你答案。

基本上所有内容都已在注释中设置。为什么不回答?我不知道。

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

istringstream ss(str);

总的来说,您遇到的问题是,您只能通过std::cin来读取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,并且必须使用“ >>”。

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

  • 流中的整数值
  • 然后用逗号
  • 然后是整数
  • 然后用逗号
  • 然后是整数
  • 。 。 。

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

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

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

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

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