实现代数表达式去括号简化的C++代码运行后为何输出乱码?
代码输出乱码的核心原因
本次输出的乱码和去括号的运算逻辑无关,是两处基础语法错误触发的未定义行为导致的:
- 内存分配语法完全错误
代码中写的char* res = new char(len);,实际语义是申请1个char类型的存储空间,用输入字符串的长度值初始化这个单字符,根本没有给结果字符串分配足够的数组空间。C++中分配字符数组的正确语法必须使用方括号:new char[长度]。
现在的写法仅分配了1字节内存,后续往里面写入完整表达式结果时已经触发了内存越界,读取时自然会输出随机的乱码字符。 - 未补充C风格字符串必需的结束符
就算把内存分配修正为正确的new char[len],代码也没有在结果字符串的末尾手动添加\0空结束符。C++中用cout输出char*类型时,会从指针位置一直向后扫描内存,直到遇到随机的\0才停止,那些不属于预期结果的内存内容就会显示为ÿï┌这类乱码。
最小修正方案
仅需改动两处即可解决问题:
- 将内存分配语句修改为
char* res = new char[len + 1];,多申请1字节专门用于存储结束符 - 在主循环结束、函数返回前,添加一行给字符串补结束符的代码:
res[index] = '\0';
额外说明:这段代码还存在数组内存泄漏的问题(用new申请的数组没有对应的delete[]释放),但该问题不会影响本次的乱码表现。
内容的提问来源于stack exchange,提问作者user14697742
相关产品推荐
相关产品推荐

