我正在创建一个函数,它应该将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 :(得分:2)
免责声明:此答案假设您正在使用
std::string
。
void split (string input1, string function, string arguments){
当像这样调用此函数时
string a = "input";
string b;
string c;
split(a, b, c);
然后,您基本上将a
,b
和c
的副本传递给函数split
(b
和{ {1}}此时为空)。为了使函数c
能够修改它们,您有两个选择:
使用指针:
split
使用参考:
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);
和b
将被修改,但更容易实现,因为在选项1中,您必须更改{{1的所有用途或者c
到function
或arguments
或者您必须添加第二个像这样的引用初始化(无论如何我会更喜欢,因为它会阻止您隐藏事实,即您“要修改那些参数”:
*function
根据给您的实际任务,函数
*arguments
可能比您的实现方式更容易实现。 PaulMcKenzie给出了一个提示,使用void split (string input1, string * _function, string * _arguments) { string & function = _function; string & arguments = _arguments; [...] }
并使用split
来提取单词。