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

C++循环不符合预期:自定义解码函数无法正常工作

C++编解码函数修复方案

问题分析

你的代码存在两个核心问题:

  1. 全局变量污染:encodedText、decodeTemp、decodedText都是全局变量,多次调用函数时会保留之前的内容,导致数据混乱。比如你在main里调用encode(myString)后,encodedText已经是"65S66S",再调用encode(myString)作为decode的参数时,encodedText会变成"65S66S65S66S",解码自然出错。
  2. 解码逻辑错误:
    • 收集数字片段时,你用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;
}

说明

  1. 全局变量替换:把所有全局字符串变量移到对应函数内部作为局部变量,每次调用函数都会重新初始化,避免数据残留。
  2. 编码函数优化:去掉了不必要的循环遍历,直接通过static_cast<int>(c)获取字符的ASCII值,效率更高。
  3. 解码逻辑修正:
    • 收集数字时直接拼接字符decodeTemp += c,保证数字片段正确。
    • 转成字符后直接添加到结果字符串decodedText += ch,得到预期的字符输出。

测试结果

运行修正后的代码,输出符合预期:

Encoded: 65S66S
Decoded: AB

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:27:53