如何通过 C++ 中的多个函数修改输入?

How do I modify an input through multiple functions in C++?

提问人:kino 提问时间:7/30/2022 更新时间:7/30/2022 访问量:48

问:

基本上,我必须将名称编码为 Soundex 代码。我实现的帮助程序函数执行以下操作:

  1. 丢弃姓氏中的所有非字母字符:破折号、空格、撇号等。
  2. 将每个字母编码为数字
  3. 合并代码中的相邻重复数字(例如,222025变为 2025)。
  4. 将代码的第一位数字替换为原始名称的第一个字母,转换为大写。
  5. 从代码中删除所有零。
  6. 通过用零填充或截断多余的部分,使代码的长度正好为 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."
}
C++ 字符串 逐个引用

评论

1赞 user4581301 7/30/2022
请注意,帮助程序函数都返回函数的结果。您应该利用这些返回值。

答:

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;
}

如果要更改变量的值,则通常使用 .我相信你知道这一点,但由于某种原因你忘记了,因为涉及函数。=