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

时间:2016-11-29 21:02:35

标签: c++ input split

我正在创建一个函数,它应该将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]);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

  

免责声明:此答案假设您正在使用std::string

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

当像这样调用此函数时

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

split(a, b, c);

然后,您基本上将abc副本传递给函数splitb和{ {1}}此时为空)。为了使函数c能够修改它们,您有两个选择:

  1. 使用指针:

    split
  2. 使用参考:

    void split (string input1, string * function, string * arguments) {
        [...]
    }
    split(a, &b, &c);
    
  3. 选项2隐藏了以下事实:调用者的void split (string input1, string & function, string & arguments) { [...] } split(a, b, c); b将被修改,但更容易实现,因为在选项1中,您必须更改{{1的所有用途或者cfunctionarguments或者您必须添加第二个像这样的引用初始化(无论如何我会更喜欢,因为它会阻止您隐藏事实,即您“要修改那些参数”:

    *function
      

    根据给您的实际任务,函数*arguments可能比您的实现方式更容易实现。 PaulMcKenzie给出了一个提示,使用void split (string input1, string * _function, string * _arguments) { string & function = _function; string & arguments = _arguments; [...] } 并使用split来提取单词。