gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:11:09 25 4
gpt4 key购买 nike

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

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

编辑

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

最佳答案

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

但让我给你答案。

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

在您可以从std::istringstream中读取内容之前,您需要在其中添加内容。您需要初始化它。通常通过使用其构造函数来完成:

istringstream ss(str);

总的来说,您遇到的问题是,您只能从 std::cincin >> 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;
}

这将保存该子功能。

编辑:

好的,您想阅读c​​sv,并且必须使用“>>”。

如果要从流中读取用逗号分隔的数据,则需要提取:
  • 来自流
  • 的整数值
  • 然后是逗号
  • 然后是整数
  • 然后是逗号
  • 然后是整数
  • 。 。 。

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

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

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

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

    关于c++ - 为什么这段代码没有给出期望的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535356/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com