C++ - 整数解析
C++ - Integer Parsing
我正在为 'StringStream' problem from HackerRank 苦苦挣扎。准确地说,我得到了一串以逗号分隔的整数,例如“23,4,56”,我需要解析它们和 return 一个整数向量。
我已经尝试过各种方法来解决这个问题,但它们都不适合我。
这是原代码。
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
vector <int> parseInts(string str)
{
// Function to complete.
}
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;
}
这是我的第一个想法,用StringStream库转换。
vector <int> parseInts(string str)
{
stringstream ss(str);
int number;
// To help with conversion.
vector <int> temporary;
// Vector of results.
for (int i = 0; i < str.length(); i++)
{
ss >> number;
temporary.push_back(number);
}
return temporary;
}
这是我的第二个想法。
vector <int> parseInts(string str)
{
int number;
vector <int> temporary;
for (int i = 0; i < str.length(); i++)
{
number = (str[i]);
temporary.push_back(number);
}
return temporary;
}
这是最后一个想法,我想在 char* 上工作。
vector <int> parseInts(string str)
{
char* characters;
strcpy(characters, str.c_str());
int numbers;
vector <int> temp;
for (int i = 0; i < str.length(); i++)
{
numbers = stoi(characters);
temp.push_back(numbers);
}
return temp;
}
除了最后一个例子,他们 return 还输入了一些奇怪的数字。我该如何处理?
你可以这样做:
stringstream ss;
ss << str;
vector<int> res;
while (ss) {
int n;
ss >> n;
res.push_back(n);
char c;
ss >> c;
}
您使用第一种方法就差不多了,您需要使用 std::getline 来使用逗号作为分隔符进行分隔。
vector<int> parseInts(string str)
{
stringstream ss(str);
string token;
vector<int> v;
while (getline(ss, token, ',')) {
int x = stoi(token);
v.push_back(x);
}
return v;
}
这是我测试的link:https://ideone.com/JGOpS1
在你最后的方法中,你忘记迭代 characters
。您基本上 str.length()
次调用 stoi("23,4,56")
。这是未定义行为和一些奇怪数字的主要来源。
Hackerrank 问题有 useful discussion section。您可以找到很多方法来解决这个问题。
我做了这样的事情
vector<int> parseInts(string str) {
// Complete this function
stringstream ss(str);
string token;
vector<int> integers;
while(getline(ss,token,',')){
integers.push_back(stoi(token));
}
return integers;
}
我正在为 'StringStream' problem from HackerRank 苦苦挣扎。准确地说,我得到了一串以逗号分隔的整数,例如“23,4,56”,我需要解析它们和 return 一个整数向量。
我已经尝试过各种方法来解决这个问题,但它们都不适合我。
这是原代码。
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
vector <int> parseInts(string str)
{
// Function to complete.
}
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;
}
这是我的第一个想法,用StringStream库转换。
vector <int> parseInts(string str)
{
stringstream ss(str);
int number;
// To help with conversion.
vector <int> temporary;
// Vector of results.
for (int i = 0; i < str.length(); i++)
{
ss >> number;
temporary.push_back(number);
}
return temporary;
}
这是我的第二个想法。
vector <int> parseInts(string str)
{
int number;
vector <int> temporary;
for (int i = 0; i < str.length(); i++)
{
number = (str[i]);
temporary.push_back(number);
}
return temporary;
}
这是最后一个想法,我想在 char* 上工作。
vector <int> parseInts(string str)
{
char* characters;
strcpy(characters, str.c_str());
int numbers;
vector <int> temp;
for (int i = 0; i < str.length(); i++)
{
numbers = stoi(characters);
temp.push_back(numbers);
}
return temp;
}
除了最后一个例子,他们 return 还输入了一些奇怪的数字。我该如何处理?
你可以这样做:
stringstream ss;
ss << str;
vector<int> res;
while (ss) {
int n;
ss >> n;
res.push_back(n);
char c;
ss >> c;
}
您使用第一种方法就差不多了,您需要使用 std::getline 来使用逗号作为分隔符进行分隔。
vector<int> parseInts(string str)
{
stringstream ss(str);
string token;
vector<int> v;
while (getline(ss, token, ',')) {
int x = stoi(token);
v.push_back(x);
}
return v;
}
这是我测试的link:https://ideone.com/JGOpS1
在你最后的方法中,你忘记迭代 characters
。您基本上 str.length()
次调用 stoi("23,4,56")
。这是未定义行为和一些奇怪数字的主要来源。
Hackerrank 问题有 useful discussion section。您可以找到很多方法来解决这个问题。
我做了这样的事情
vector<int> parseInts(string str) {
// Complete this function
stringstream ss(str);
string token;
vector<int> integers;
while(getline(ss,token,',')){
integers.push_back(stoi(token));
}
return integers;
}