为什么这段代码没有给出所需的输出?

1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

Arm*_*gny 6

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

但让我给你答案。

基本上所有内容都已在评论中设置。为什么不在答案中?我不知道。

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

istringstream ss(str);
Run Code Online (Sandbox Code Playgroud)

在 main 中,您遇到了问题,您只能从std::cinwith读取一个值cin >> str;。您想使用std::getline它来读取整行。并且不仅是“某物”直到下一个空间。所以

getline(cin, str);
Run Code Online (Sandbox Code Playgroud)

将进一步帮助您。

在现代 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;
}
Run Code Online (Sandbox Code Playgroud)

这将保存子功能。


编辑:

好的,你想读取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;
}
Run Code Online (Sandbox Code Playgroud)

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