我正在编写一个函数,它从一个字符串(用户名)中删除元音,然后将该函数传递给另一个函数,该函数将打印出不带元音的用户名。为了将input[i]
复制到outputNoVowels
,这是正确的做法吗?
string removeVowels(string input) {
string outputNoVowels;
for (int i = 0; i < input.length() - 1; i++) {
switch (input[i]) {
case 'a':
break;
case 'e':
break;
case 'i':
break;
case 'o':
break;
case 'u':
break;
case 'A':
break;
case 'E':
break;
case 'I':
break;
case 'O':
break;
case 'U':
break;
default:
outputNoVowels = input[i];
}
}
return outputNoVowels;
}
为什么当程序运行时,它只打印出字符串中的一个字母?
提供的算法:
以下是控制台窗口中打印的内容:
UPDATE:如何对char[]
字符串执行同样的操作?
void removeVowels(const char input[], char output[]) {
for (int i = 0; i < strlen(input) - 1; i++) {
switch (input[i]) {
case 'a':
break;
case 'e':
break;
case 'i':
break;
case 'o':
break;
case 'u':
break;
case 'A':
break;
case 'E':
break;
case 'I':
break;
case 'O':
break;
case 'U':
break;
default:
strcpy(output, input);
strcat(output, input);
}
}
}
提供的算法:
1条答案
按热度按时间k5ifujac1#
在输出中得到1个字母是因为您通过
=
赋值运算符将每个字母赋值给outputNoVowels
,每次都清除其当前内容,因此return
上的outputNoVowels
中最多只有1个字母。您需要通过
+=
操作符(或push_back()
或append()
方法)将每个字母**追加 *,到outputNoVowels
,从而保留任何现有内容。另外,你的循环忽略了
input
字符串中的最后一个字符。指令中有一个打字错误。请尝试以下操作:
也就是说,您可以使用标准的
std::copy_if()
算法(以std::back_inserter
作为目标)来完全消除switch
,例如:或者,使用
std::remove_if()
算法,例如:或者,使用
std::erase_if()
算法(C++20及更高版本),例如:UPDATE:在您的
char[]
版本中,您遇到了相反的问题。您在输出字符串中 * 追加了*太多的字母。对于您要保留的每个字母,您将整个输入字符串分配给输出,然后将整个输入字符串追加到末尾,而不仅仅是1个字母。您可以使用与上面类似的技巧来求解
char[]
版本,例如:或者,使用
std::copy_if()
算法: