为什么这个分割功能不起作用?

问题描述:

我正在创建一个函数,它应该将input1分为function字符串(其中包含第一个字input1)和arguments字符串(其中包含input1的其余部分)。如果我尝试打印function字符串和arguments字符串,它们显示为空。为什么这个分割功能不起作用?

我该怎么办?

void split (string input1, string function, string arguments){ 

    bool args = false; 

    string undefined; 

    for (int i = 0; i < input1.length(); i++){ 

     if (input1[i] == ' '){ 
      if (i == 0) { 
       input1.erase(0, 1); 
      } else if (i == (input1.length() - 1)){ 
       input1.erase((input1.length() - 1), 1); 
      } else { 
       if (!args) { 
        for (int o = 0; o < undefined.length(); o++) 
         function.push_back(undefined[o]); 
        args = true; 
       } else if (args) { 
        for (int u = 0; u < undefined.length(); u++) 
         arguments.push_back(undefined[u]); 
       } 
      } 

     } else { 
      if (i == (input1.length() - 1)){ 
       undefined.push_back(input[i]); 
       if (!args) 
        for (int u = 0; u < undefined.length(); u++) 
         function.push_back(undefined[u]); 
       else 
        for (int e = 0; e < undefined.length(); e++) 
         arguments.push_back(undefined[e]); 
      } else { 
       undefined.push_back(input[i]); 
      } 
     } 
    } 
} 
+0

请考虑删除c标签,因为这个问题似乎是关于C++。 –

+7

这听起来像你可能需要学习如何使用调试器来遍历代码。使用一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏离的位置。如果你打算做任何编程,这是一个重要的工具。进一步阅读:** [如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+1

为什么我有一个鬼鬼祟祟的怀疑,这个似乎过于复杂,只是从字符串中提取单词?为什么要“擦除”? – PaulMcKenzie

免责声明:这个答案是假定你使用0​​。

void split (string input1, string function, string arguments){ 

当这个函数被调用这样

string a = "input"; 
string b; 
string c; 

split(a, b, c); 

那么你基本上是通过副本abc的功能splitbc是空的,在这一点上)。为了功能split能够修改这些你有两个选择:

  1. 使用指针:

    void split (string input1, string * function, string * arguments) { 
        [...] 
    } 
    split(a, &b, &c); 
    
  2. 使用引用:

    void split (string input1, string & function, string & arguments) { 
        [...] 
    } 
    split(a, b, c); 
    

选项2个皮事实上,调用者的bc将被修改,但是是ea因为在选项1中,您必须更改functionarguments*function*arguments的所有用法,否则您将不得不添加像这样的第二个参考初始化(无论如何,我宁愿这样做,因为它会阻止您隐藏事实上,你要修改这些PARAMS):

void split (string input1, string * _function, string * _arguments) { 
    string & function = _function; 
    string & arguments = _arguments; 
    [...] 
} 

根据给你的实际任务,功能split可能实现比你是如何做到的要容易得多。提示PaulMcKenzie使用std::istringstreamoperator >>来提取单词。

+0

选项2如何隐藏值可以修改的事实?这是左值引用的用途。此外,我会做出选项2,选项1,因为它更容易处理参考。 – NathanOliver

+0

@NathanOliver在调用代码中,'split(a,b,c);'与split(a,b,c)不能区分;'但它与split是分开的(a,&b,&c);' –