You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中多函数串联修改输入失效,Soundex编码实现求助

Soundex编码函数组合失效问题排查与修复

问题现状

实现了6个Soundex编码的辅助函数,单独调用每个函数并手动传递输出结果符合预期,但将它们组合到soundex主函数时,输入字符串未被修改,返回的仍是原字符串。测试输入"Curie"预期输出C600,实际得到"Curie"。

核心错误原因

1. 主函数未接收辅助函数的返回值

所有辅助函数都是返回处理后的新字符串,但soundex函数中只是调用这些函数,没有将返回值赋值给变量,导致后续操作始终在原字符串上进行,完全没用到处理后的结果。

2. 辅助函数实现逻辑错误

  • removeDuplicate和removeZeros函数用'\0'替换目标字符,但C++字符串输出时遇到'\0'会终止,且字符串实际长度未改变,后续处理会携带无效字符,正确做法是直接构建新字符串过滤掉目标内容。
  • padding函数截断部分用'\0'标记无效字符,应该直接截取前4位字符,而非修改字符值。

修复后的完整代码

#include <iostream>
#include <string>
#include <algorithm> // 用于transform

using namespace std; // 补充避免编译错误

string removeNonLetters(string s) {
    string result = "";
    for (char c : s) {
        if (isalpha(c)) {
            result += c;
        }
    }
    return result;
}

string encode(string name) {
    transform(name.begin(), name.end(), name.begin(), ::toupper);
    string encoded = "";
    for (char c : name) {
        if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' || c == 'H' || c == 'W' || c == 'Y')
            encoded += '0';
        else if (c == 'B' || c == 'F' || c == 'P' || c == 'V')
            encoded += '1';
        else if (c == 'C' || c == 'G' || c == 'J' || c == 'K' || c == 'Q' || c == 'S' || c == 'X' || c == 'Z')
            encoded += '2';  
        else if (c == 'D' || c == 'T')
            encoded += '3';
        else if (c == 'L')
            encoded += '4';
        else if (c == 'M' || c == 'N')
            encoded += '5';
        else if (c == 'R')
            encoded += '6';
    }
    return encoded;
}

string removeDuplicate(string encoded) {
    if (encoded.empty()) return "";
    string result;
    result += encoded[0];
    for (size_t i = 1; i < encoded.size(); ++i) {
        // 跳过与前一个字符相同的数字
        if (encoded[i] != result.back()) {
            result += encoded[i];
        }
    }
    return result;
}

string removeZeros(string digits) {
    string result = "";
    for (char c : digits) {
        if (c != '0') {
            result += c;
        }
    }
    return result;
}

string padding(string output) {
    if (output.size() < 4) {
        output.append(4 - output.size(), '0');
    } else if (output.size() > 4) {
        output = output.substr(0, 4);
    }
    return output;
}

string soundex(string s) {
    // 按顺序调用辅助函数,并接收返回值更新变量
    string processed = removeNonLetters(s);
    if (processed.empty()) return ""; // 处理空输入的边界情况
    
    string encoded = encode(processed);
    string noDuplicates = removeDuplicate(encoded);
    // 用原处理后字符串的首字母大写替换第一个数字
    noDuplicates[0] = toupper(processed[0]);
    string noZeros = removeZeros(noDuplicates);
    string finalCode = padding(noZeros);
    
    return finalCode;
}

int main() {
    string s = "Curie";
    cout << soundex(s) << '\n'; // 输出C600
}

关键修改点说明

  1. 主函数流程修正:将每个辅助函数的返回值赋值给新变量,确保每一步处理结果都被传递到下一步。
  2. 辅助函数逻辑优化:
    • removeDuplicate:遍历构建新字符串,跳过相邻重复字符,避免使用'\0'。
    • removeZeros:直接过滤掉所有'0'字符,构建新字符串。
    • padding:使用append补0,substr截断,替代'\0'标记的错误方式。
  3. 首字母替换修正:使用处理后(已移除非字母)的字符串首字母转大写,而非原字符串的首字母。
  4. 补充using namespace std;:原代码遗漏导致transform等函数编译错误,补充后保证代码可正常编译运行。

内容的提问来源于stack exchange,提问作者kino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:15:28