C++字符读取问题:无法读取'Z'及组合重复原因咨询
问题分析与代码修正
嘿,我来帮你解决这两个问题,咱们一个个来拆解:
1. 为什么无法读取ASCII码90对应的'Z'?
你的代码里定义了char v[90];,C++数组的下标是从0开始的,长度为90的数组最大合法下标是89。当i=90时,v[i]属于数组越界访问,这是未定义行为,会读取到内存里的随机垃圾值,自然无法正确输出'Z'。
其实你完全不需要这个数组——直接把循环变量i/j/k强制转换为char输出就可以了,没必要提前存储这些ASCII字符。
2. 为什么会出现重复字母的组合?
理论上你的条件if(i!=j)和if(j!=k && i!=k)已经能确保三个字母不重复,但问题出在数组越界导致的异常值干扰:当i=90时,v[i]是非法值,可能和其他字符重复;另外,越界访问带来的随机内存值输出,也会让你误以为是重复字母。
当然也可能是原代码缩进混乱导致你看错了条件范围,修复数组问题后这个现象就会消失。
修正后的代码
#include <iostream> using namespace std; int main() { for(int i = 65; i <= 90; ++i) { for(int j = 65; j <= 90; ++j) { if(i != j) { // 确保第一个和第二个字母不同 for(int k = 65; k <= 90; ++k) { if(k != i && k != j) { // 确保第三个字母和前两个都不同 cout << (char)i << (char)j << (char)k << ' '; } } cout << endl; } } cout << endl; } return 0; }
修正点说明:
- 去掉了多余的
v数组,直接通过(char)i将ASCII码转换为对应字符输出,彻底避免数组越界问题。 - 调整了代码缩进,让逻辑层级更清晰(原代码缩进混乱,容易误判条件范围)。
- 严格保留了三字母不重复的判断逻辑,确保输出的组合都是唯一字母的排列。
这样修改后,你就能正确输出从"ABC"到"ZYX"所有不重复的3字符字母组合,并且'Z'也能正常显示啦~
内容的提问来源于stack exchange,提问作者pandurel
相关产品推荐
相关产品推荐

