为什么此代码没有提供所需的输出?
why is this code not giving the desired output?
#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;
}
我想创建一个流,到一个字符串,从字符串中读取整数到流并将它插入一个向量并在输出显示时显示它的元素nothing.what代码有问题吗?
编辑
基本上这个问题要求以逗号分隔的整数形式输入,并要求我们在解析后打印整数。我发现这两个函数之间没有显着差异,但 parseInt2 仍然有效(在 main 中调用函数时,当然不是 parseInt)。为什么?
我担心你的问题会被 SO 上的人关闭。
但让我给你答案。
基本上所有设置都已经在评论中了。为什么不在答案中?我不知道。
在您可以从 std::istringstream
中读取内容之前,您需要将内容放入其中。你需要初始化它。这通常是通过使用它的构造函数来完成的:
istringstream ss(str);
在 main 中,您遇到了一个问题,即您使用 cin >> str;
只从 std::cin
中读取了一个值。您想改用 std::getline
,它会读取整行。而且不仅 "something" 到下一个 space。所以
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 必须使用“>>”。
如果要从流中读取以逗号分隔的数据,则需要提取:
- 来自流的整数值
- 然后一个逗号
- 然后是一个整数
- 然后一个逗号
- 然后是一个整数
- 。 . .
提取器运算符或其背后的功能将始终从流中提取字符并将其转换为请求的类型(例如整数),直到达到 space 或无法进行转换继续(例如,“,”是分隔符)。
这就是为什么你的第二个函数起作用的原因。
请务必始终检查提取操作的状态,这一点很重要。在下面的示例中,您将看到,在字符串的末尾,我们尝试读取一个逗号,其中有 none。提取失败,但我们不在乎。我们故意忽略它。要更好地了解功能,请参阅。
#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;
}
如果您有任何问题,我很乐意回答。
#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;
}
我想创建一个流,到一个字符串,从字符串中读取整数到流并将它插入一个向量并在输出显示时显示它的元素nothing.what代码有问题吗?
编辑
基本上这个问题要求以逗号分隔的整数形式输入,并要求我们在解析后打印整数。我发现这两个函数之间没有显着差异,但 parseInt2 仍然有效(在 main 中调用函数时,当然不是 parseInt)。为什么?
我担心你的问题会被 SO 上的人关闭。
但让我给你答案。
基本上所有设置都已经在评论中了。为什么不在答案中?我不知道。
在您可以从 std::istringstream
中读取内容之前,您需要将内容放入其中。你需要初始化它。这通常是通过使用它的构造函数来完成的:
istringstream ss(str);
在 main 中,您遇到了一个问题,即您使用 cin >> str;
只从 std::cin
中读取了一个值。您想改用 std::getline
,它会读取整行。而且不仅 "something" 到下一个 space。所以
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 必须使用“>>”。
如果要从流中读取以逗号分隔的数据,则需要提取:
- 来自流的整数值
- 然后一个逗号
- 然后是一个整数
- 然后一个逗号
- 然后是一个整数
- 。 . .
提取器运算符或其背后的功能将始终从流中提取字符并将其转换为请求的类型(例如整数),直到达到 space 或无法进行转换继续(例如,“,”是分隔符)。
这就是为什么你的第二个函数起作用的原因。
请务必始终检查提取操作的状态,这一点很重要。在下面的示例中,您将看到,在字符串的末尾,我们尝试读取一个逗号,其中有 none。提取失败,但我们不在乎。我们故意忽略它。要更好地了解功能,请参阅。
#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;
}
如果您有任何问题,我很乐意回答。