C++循环不符合预期:自定义解码函数无法正常工作
C++编解码函数修复方案
问题分析
你的代码存在两个核心问题:
- 全局变量污染:
encodedText、decodeTemp、decodedText都是全局变量,多次调用函数时会保留之前的内容,导致数据混乱。比如你在main里调用encode(myString)后,encodedText已经是"65S66S",再调用encode(myString)作为decode的参数时,encodedText会变成"65S66S65S66S",解码自然出错。 - 解码逻辑错误:
- 收集数字片段时,你用
decodeTemp += to_string(toDecode[i]);,这里toDecode[i]是字符(比如'6'),to_string(char)会把它的ASCII值(54)转成字符串,导致decodeTemp变成"54"而不是"6",后续转成整数就完全错误。 - 转成字符后,你用
decodedText += to_string(test);,这里test是字符'A'(ASCII 65),to_string(char)会把它转成"65",而不是直接添加字符'A'。
- 收集数字片段时,你用
修正后的代码
#include <iostream> #include <string> using namespace std; string encode(string toEncode) { string encodedText; // 改为局部变量 for (char c : toEncode) { // 直接取字符的ASCII值,无需循环遍历 encodedText += to_string(static_cast<int>(c)) + 'S'; } return encodedText; } string decode(string toDecode) { string decodedText; // 改为局部变量 string decodeTemp; // 改为局部变量 for (char c : toDecode) { if (c == 'S') { // 将数字字符串转成整数,再转成字符 char ch = static_cast<char>(stoi(decodeTemp)); decodedText += ch; // 直接添加字符,不是转成字符串 decodeTemp.clear(); } else { decodeTemp += c; // 直接添加字符,无需转成字符串 } } return decodedText; } int main() { string myString = "AB"; string encoded = encode(myString); cout << "Encoded: " << encoded << endl; cout << "Decoded: " << decode(encoded); return 0; }
说明
- 全局变量替换:把所有全局字符串变量移到对应函数内部作为局部变量,每次调用函数都会重新初始化,避免数据残留。
- 编码函数优化:去掉了不必要的循环遍历,直接通过
static_cast<int>(c)获取字符的ASCII值,效率更高。 - 解码逻辑修正:
- 收集数字时直接拼接字符
decodeTemp += c,保证数字片段正确。 - 转成字符后直接添加到结果字符串
decodedText += ch,得到预期的字符输出。
- 收集数字时直接拼接字符
测试结果
运行修正后的代码,输出符合预期:
Encoded: 65S66S Decoded: AB
内容的提问来源于stack exchange,提问作者Gorzan
相关产品推荐
相关产品推荐

