【问题标题】:C++ - Integer ParsingC++ - 整数解析
【发布时间】:2020-05-01 11:25:13
【问题描述】:

我正在为'StringStream' problem from HackerRank 苦苦挣扎。准确地说,我得到了一串以逗号分隔的整数,例如“23,4,56”,我需要解析它们并返回一个整数向量。

我尝试了各种方法来解决这个问题,但它们对我不起作用。

这是原始代码。

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

除了最后一个例子,他们返回了一些奇怪的数字。我该如何处理?

【问题讨论】:

  • “一些奇怪的数字”——这些数字是什么?它们有多奇怪?
  • 我已经尝试了各种方法来解决这个问题 -- 最简单的方法是简单地用空格替换逗号并使用你的第一种方法。你试过吗?用空格替换逗号是一行 C++。
  • 此外,您的第一种方法应该是使用while (ss &gt;&gt; number) 循环,而不是for 循环。甚至不要考虑你的最后一种方法——它只是回到低级 C 编程,你应该使用 C++。

标签: c++ parsing stringstream


【解决方案1】:

在您的最后一种方法中,您忘记了迭代 characters。你基本上str.length() 次调用stoi("23,4,56")。这是未定义行为和一些奇怪数字的主要来源。

Hackerrank 问题有useful discussion section。你可以找到很多方法来解决这个问题。

【讨论】:

    【解决方案2】:

    您使用第一种方法几乎就在那里,您需要使用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;
    }
    

    这是我测试它的链接:https://ideone.com/JGOpS1

    【讨论】:

      【解决方案3】:

      你可以这样做:

      stringstream ss;
      ss << str;
      vector<int> res;
      while (ss) {
          int n;
          ss >> n;
          res.push_back(n);
          char c;
          ss >> c;
      }
      

      【讨论】:

        【解决方案4】:

        我做了这样的事情

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

        【讨论】:

        • 这个和已经接受的答案有什么区别?
        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 2011-04-03
        • 2010-10-16
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多