提问人:kino 提问时间:7/30/2022 更新时间:7/30/2022 访问量:48
如何通过 C++ 中的多个函数修改输入?
How do I modify an input through multiple functions in C++?
问:
基本上,我必须将名称编码为 Soundex 代码。我实现的帮助程序函数执行以下操作:
- 丢弃姓氏中的所有非字母字符:破折号、空格、撇号等。
- 将每个字母编码为数字
- 合并代码中的相邻重复数字(例如,222025变为 2025)。
- 将代码的第一位数字替换为原始名称的第一个字母,转换为大写。
- 从代码中删除所有零。
- 通过用零填充或截断多余的部分,使代码的长度正好为 4。
请原谅帮助程序函数的实现,我知道它们可以更好地实现。但是当我手动将输出从一个函数传递到另一个函数时,我看到结果是我想要的。只有当我将它们全部组合到一个函数中时,我才会看到我传递的输出就好像我根本没有修改我传递的输入一样。我相信我的问题可能与通过引用传递有关,但是对我的所有函数这样做没有任何区别或给出了不正确的输出。
#include <iostream>
#include <string>
string removeNonLetters(string s) {
string result = "";
for (int i = 0; i < s.length(); i++) {
if (isalpha(s[i])) {
result += s[i];
}
}
return result;
}
string encode(string name) {
std::transform(name.begin(), name.end(), name.begin(), ::toupper);
string encoded = "";
for (int i = 0; i < name.size(); ++i) {
if (name[i] == 'A' || name[i] == 'E' || name[i] == 'I' || name[i] == 'O' || name[i] == 'U' || name[i] == 'H' || name[i] == 'W' || name[i] == 'Y')
encoded += '0';
else if (name[i] == 'B' || name[i] == 'F' || name[i] == 'P' || name[i] == 'V')
encoded += '1';
else if (name[i] == 'C' || name[i] == 'G' || name[i] == 'J' || name[i] == 'K' || name[i] == 'Q' || name[i] == 'S' || name[i] == 'X' || name[i] == 'Z')
encoded += '2';
else if (name[i] == 'D' || name[i] == 'T')
encoded += '3';
else if (name[i] == 'L')
encoded += '4';
else if (name[i] == 'M' || name[i] == 'N')
encoded += '5';
else if (name[i] == 'R')
encoded += '6';
}
return encoded;
}
string removeDuplicate(string encoded) {
for (int i = 0; i < encoded.size(); ++i) {
if (encoded[i] == encoded[i+1])
encoded[i] = '\0';
}
return encoded;
}
string removeZeros(string digits) {
for (int i = 0; i < digits.size(); ++i) {
if (digits[i] == '0')
digits[i] = '\0';
}
return digits;
}
string padding(string output) {
int size = output.size();
if (size < 4) {
for (int i = size; i < 4; ++i)
output += '0';
}
else if (size > 4) {
for (int j = size; j > 3; --j)
output[j] = '\0';
}
return output;
}
/* TODO: Replace this comment with a descriptive function
* header comment.
*/
string soundex(string s) {
/* TODO: Fill in this function. */
string copy = s;
removeNonLetters(s);
encode(s);
removeDuplicate(s);
s[0]= copy[0];
removeZeros(s);
padding(s);
return s;
}
int main() {
string s = "Curie";
cout << soundex(s) << '\n';
// Output should be C600 but I keep getting "Curie."
}
答:
1赞
john
7/30/2022
#1
您的函数返回调整后的字符串,这很好。但是您的调用代码不使用返回值!
像这样的东西就是你想要的。
string soundex(string s) {
/* TODO: Fill in this function. */
string copy = s;
s = removeNonLetters(s);
s = encode(s);
s = removeDuplicate(s);
s[0] = copy[0];
s = removeZeros(s);
s = padding(s);
return s;
}
如果要更改变量的值,则通常使用 .我相信你知道这一点,但由于某种原因你忘记了,因为涉及函数。=
评论