【问题标题】:Why this split function does not work? [closed]为什么这个拆分功能不起作用? [关闭]
【发布时间】:2016-11-29 21:02:34
【问题描述】:

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

【问题讨论】:

  • 请考虑删除 c 标签,因为这个问题似乎是关于 C++ 的。
  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs
  • 为什么我会偷偷怀疑这似乎过于复杂,只是从字符串中提取单词?为什么打电话给erase
  • 你为什么不简单地使用std::istringstreamoperator &gt;&gt;来提取单词?
  • @PaulMcKenzie 可能是因为你不知道给学生的任务的确切措辞?

标签: c++ input split


【解决方案1】:

免责声明:此答案假定您使用的是std::string

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

当这个函数被这样调用时

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

split(a, b, c);

那么您实际上是将abc副本 传递给函数split(此时bc 为空)。为了使函数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 将被修改,但更易于实现,因为在选项 1 中,您必须更改所有使用 functionarguments*function*arguments 或者你必须添加第二个这样的引用初始化(无论如何我更喜欢它,因为它阻止你隐藏你要修改这些参数的事实):

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

根据给您的实际任务,函数split 的实现可能比您实现它的方式容易得多。 PaulMcKenzie 给出了一个提示,使用 std::istringstream 提取单词是 operator &gt;&gt;

【讨论】:

  • 选项 2 如何隐藏值可以修改的事实?这就是左值引用的用途。我也会选择选项 2,选项 1,因为它更容易处理引用。
  • @NathanOliver 在调用代码中,split(a, b, c);split(a, b, c); 不可区分,但可与 split(a, &amp;b, &amp;c); 区分
猜你喜欢
  • 2017-03-24
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多