c++ - 为什么这段代码没有给出想要的输出?
问题描述
#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)。为什么?
解决方案
我担心你的问题会被 SO 上的人关闭。
但让我给你答案。
基本上所有的东西都已经在评论中设置好了。为什么不在答案中?我不知道。
在从 中读取某些内容之前std::istringstream
,您需要在其中放入一些内容。你需要初始化它。这通常是通过使用它的构造函数来完成的:
istringstream ss(str);
主要问题是,您只从std::cin
with中读取了一个值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;
}
如果您有任何问题,我很乐意回答。
推荐阅读
- react-native - AsyncStorage.getItem("item") 返回字符串“[object Object]”
- docker - docker-compose 文件中的命令键如何工作
- java - 如何在Hashmap中添加与key对应的列表元素?
- c++ - C++中的字节流
- docker - 如何在构建期间创建的中间容器上使用标签过滤器(假设 LABEL 在 FROM 命令之后立即设置)?
- email - Phpmailer 使用自己的域
- python - 从 1919 年到 1930 年按国家/地区的最大数量排序前 2 个国家
- c++ - 查找最大乘积子数组
- node.js - AWS Elasticsearch Service 抛出的“没有可用于处理请求的服务器”
- python - 使用共享 yaxes 但“链接”xaxes 进行绘图