C++ 为什么这个拆分函数不起作用?

C++ 为什么这个拆分函数不起作用?,c++,input,split,C++,Input,Split,我正在创建一个函数,它应该将input1拆分为函数字符串(包含input1的第一个单词)和参数字符串(包含input1的其余部分)。如果我试图打印函数字符串和参数字符串,它们将显示为空 我该怎么办 void split (string input1, string function, string arguments){ bool args = false; string undefined; for (int i = 0; i < input1.length

我正在创建一个函数,它应该将
input1
拆分为
函数
字符串(包含
input1
的第一个单词)和
参数
字符串(包含
input1
的其余部分)。如果我试图打印
函数
字符串和
参数
字符串,它们将显示为空

我该怎么办

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]);
            }
        }
    }
}
void拆分(字符串输入1、字符串函数、字符串参数){
bool args=false;
字符串未定义;
对于(int i=0;i
免责声明:此答案假设您使用的是
std::string

当这个函数被这样调用时

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

split(a, b, c);
然后您实际上是将
a
b
c
的副本传递给函数
split
b
c
在该点为空)。为了使函数
split
能够修改它们,您有两个选项:

  • 使用指针:

    void split (string input1, string * function, string * arguments) {
        [...]
    }
    split(a, &b, &c);
    
  • 使用参考资料:

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

    根据给您的实际任务,函数
    split
    的实现可能比您的方式简单得多。一个提示是使用
    std::istringstream
    ,然后使用
    operator>
    来提取单词


    请考虑删除C标签,因为这个问题似乎是关于C++的。听起来你可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:为什么我会偷偷地怀疑,仅仅从字符串中提取单词似乎过于复杂?为什么调用
    erase
    ?为什么不直接使用
    std::istringstream
    操作符>
    提取单词?@PaulMcKenzie可能是因为你不知道给学生的任务的确切措辞?选项2如何隐藏可以修改值的事实?这就是左值引用的用途。另外,我会选择选项2,选项1,因为它更容易处理调用代码中的引用。@NathanOliver,
    split(a,b,c)与拆分(a、b、c)无法区分但它与
    拆分(a、b和c)不同
    
    void split (string input1, string & function, string & arguments) {
        [...]
    }
    split(a, b, c);
    
    void split (string input1, string * _function, string * _arguments) {
        string & function = _function;
        string & arguments = _arguments;
        [...]
    }