【问题标题】:Getting some junk returned by a function获取函数返回的一些垃圾
【发布时间】:2018-09-19 12:15:17
【问题描述】:

我参加了不同的编码竞赛,因此无法使用 python,因为它的执行时间太慢,但我真的很喜欢 input.split() 的东西,所以我尝试实现自己的拆分。 这是我想出的:

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

vector<string> splt(string s){
    vector<string> ans={};
    for(int i=0;i<s.size();i++){
        string str="";
        while(s[i]!=' '){
            str+=s[i];
            i++;
        }
        ans.push_back(str);
    }
    return ans;
}

int main(){
    string s;
    getline(cin, s);
    vector<string> ans=splt(s);
    for(auto i:ans)
        cout<<i<<", ";
}

但是函数返回的向量经常(但并非总是)最后有一些垃圾。希望能帮助我纠正我的代码,以及将字符串拆分为数组的其他一些实现。

附:对不起,如果我的英语不好,我来自俄罗斯,甚至还没有完成学业:)

【问题讨论】:

  • python 标签在这里做什么?
  • 您的计算机上有一个名为“调试器”的工具。使用此工具,您可以一次运行程序并检查所有变量的值。这个调试器会告诉你函数返回垃圾的确切原因。原因很明显,但您问题的真正答案是:学习如何使用调试器。这就是它的用途。了解如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。
  • 您的内部循环 while(s[i]!=' ') ... 不检查字符串的结尾。试试 while(s[i]!=' '&&i
  • 除非您的输入字符串以空格结尾,否则这是行不通的,这不太可能。
  • 每个问题一个问题,请。您的第二个问题与stackoverflow.com/q/236129/3002139 重复。请考虑将其删除。

标签: c++ string function vector


【解决方案1】:

在这个循环中:

    while(s[i]!=' '){
        str+=s[i];
        i++;
    }

您永远不会检查i 是否在s 的边界之外,只要那里没有' 'i 就会超出边界,并且字符串将在边界之外访问界限。越界访问字符串的行为是未定义的。

【讨论】:

    【解决方案2】:

    您的内部循环不会在字符串的末尾停止,只会在遇到空格字符时停止。
    因此,如果您的输入不以空格结尾,那么您将在字符串之外建立索引并且具有未定义的行为。
    (当它起作用时,连续的空格字符会产生空字符串,这可能是您不想要的。)

    在空白处分割最直接的方法是使用流:

    #include <sstream>
    
    vector<string> split(string s){
        vector<string> ans;
        istringstream ss(s);
        string word;
        while (ss >> word)
            ans.push_back(word);
        return ans;
    }
    

    #include <algorithm>
    #include <iterator>
    #include <sstream>
    
    vector<string> split(string s){
        vector<string> ans;
        istringstream ss(s);
        copy(istream_iterator<string>(ss), istream_iterator<string>(), back_inserter(ans));
        return ans;
    }
    

    【讨论】:

      【解决方案3】:
      while(s[i]!=' '){
              str+=s[i];
              i++;
      }
      

      上面的代码部分没有检查 s 的边界。在执行i++ 时,您可能会越过字符串的边界。所以检查i == s.size() 是否退出循环。

      【讨论】:

        【解决方案4】:

        您的 while 循环不会检查字符串的结尾,因此如果您到达字符串中的最后一个空格,它不会在最后一个字符处停止。

        while(s[i]!=' ' && i<s.size()){
        

        使用来自其他答案的流的解决方案可能更聪明,或者使用字符串类的 find 方法和 substring 方法。示例:

        vector<string> splt(string s){
            vector<string> ans={};
            size_t found = s.find_first_of(' ');
            size_t last = 0;
            while(found!=string::npos){
                ans.push_back(s.substr(last,found));
                last = found+1;
                found = s.find_first_of(' ',found+1);
            }
            ans.push_back(s.substr(last,s.size()));
            return ans;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-30
          • 1970-01-01
          • 2014-06-06
          • 2023-02-06
          • 2017-02-23
          • 1970-01-01
          • 2013-06-07
          • 1970-01-01
          相关资源
          最近更新 更多