Nonogram开发问题:计数器>9时需输出对应字母而非数字
问题分析与解决方案
你的问题根源在于两个关键错误:字母计算逻辑错误和类型不匹配导致输出ASCII码而非字符。咱们一步步来修复:
1. 修正字母计算逻辑
你需要的是counter=10→A、counter=11→B,但当前代码里'a'+counter的计算完全不符合需求:
- 大写字母
A的ASCII值是65,所以当counter>9时,应该用'A' + (counter - 10)来计算对应的字母(比如10-10=0 → 65+0=65='A',11-10=1→66='B') - 如果想用小写字母就用
'a' + (counter -10),但你的需求是输出A/B这类大写字母,所以用大写基准更合适
2. 修复letter函数的类型与返回值问题
你的letter函数返回的是int,但实际需要返回字符;而且当前函数没有处理counter≤9的情况,也存在返回值缺失的问题。修正后的函数如下:
char nono::letter(int counter){ if (counter > 9){ // 10对应A,减去10得到字母偏移量 return 'A' + (counter - 10); } else { // counter≤9时,返回对应的数字字符(比如5→'5') return '0' + counter; } }
3. 调整数组类型或输出逻辑
你的column数组看起来是int类型,这会导致存储字符时自动转成ASCII码值(比如'A'会存成65),输出时就会打印数字而非字符。你有两种修复方式:
方式一:修改column数组类型
直接将column的类型改为char,这样可以直接存储字符,后续输出无需额外处理。
方式二:在输出时转换类型(不修改数组)
如果暂时不想改动数组类型,可以在printDescColumn函数输出时判断值的范围,转成字符输出:
if(column[j][i]!=0 ){ if (column[j][i] > 9) { // 将ASCII码值转回字符输出 cout << static_cast<char>(column[j][i]) << " "; } else { cout << column[j][i] << " "; } notEmpty=true; }else{ cout<<" "; }
4. 补全makeDis函数的收尾逻辑
你的makeDis函数还有一个小问题:当内部循环结束后,若最后一组连续的1还没处理(比如循环到最后一个元素时counter>0),这组计数会被遗漏。建议在内部循环结束后添加收尾判断:
for (int i = 0; i <= height; i++){ // 原有的判断逻辑... } // 处理循环结束后剩余的counter if(counter > 0){ column[j][besc] = letter(counter); besc++; }
测试验证
当counter=10时,修正后的letter函数返回'A'(ASCII 65),无论是直接存char数组还是输出时转类型,都会打印出预期的A而非数字。
内容的提问来源于stack exchange,提问作者VeraDJ
相关产品推荐
相关产品推荐

