ASCII艺术文本处理程序故障排查:始终输出字符'A'
问题分析与修复:ASCII艺术文本程序始终输出"A"样式
问题根源
你的程序不管输入什么字符都输出"A"的ASCII样式,核心问题是没有根据目标字符计算其在ASCII样式中的对应位置,始终取了每一行的前L个字符(也就是"A"的固定区域)。
具体错误点
看这段关键代码:
char c = (letterIndex < wordLength) ? T.charAt(letterIndex) : ' '; int index = j % L; // Hint in ASCII style line printedLine.append(lines[i].charAt(index));
你拿到目标字符c后完全没用到它来定位样式位置,index = j%L只会取0到L-1的范围,也就是每一行的开头L个字符——正好对应"A"的ASCII样式区域,所以不管输入什么,输出都是A的样式。
修复方案
要解决这个问题,需要:
- 将目标字符
c转换为对应样式索引:大写字母A对应0,B对应1,…,Z对应25;小写字母可以转成大写,非字母字符可默认用A(或按题目要求调整)。 - 计算字符在样式行中的起始偏移量:
charOffset = 字符索引 * L(每个字母占L个字符宽度)。 - 用
charOffset + index作为最终索引,从样式行中取对应字符。
修复后的完整代码
import java.util.*; class Solution { public static void main(String args[]) { Scanner in = new Scanner(System.in); // 读取ASCII样式的宽度 int L = in.nextInt(); // 读取ASCII样式的高度 int H = in.nextInt(); in.nextLine(); // 读取换行符 // 读取要显示的单词,统一转大写兼容小写输入 String T = in.nextLine().toUpperCase(); // 读取ASCII样式 StringBuilder styleBuilder = new StringBuilder(); for (int i = 0; i < H; i++) { String ROW = in.nextLine(); styleBuilder.append(ROW).append("\n"); } String style = styleBuilder.toString(); // 生成并输出结果 String[] lines = style.split("\n"); int lineCount = lines.length; int wordLength = T.length(); for (int i = 0; i < lineCount; i++) { StringBuilder printedLine = new StringBuilder(); for (int j = 0; j < wordLength; j++) { char c = T.charAt(j); // 计算字符对应的索引:A-Z对应0-25,非字母默认用A(索引0) int charIndex = (c >= 'A' && c <= 'Z') ? (c - 'A') : 0; int charOffset = charIndex * L; // 直接截取当前字符在该行的L长度片段 printedLine.append(lines[i].substring(charOffset, charOffset + L)); } System.out.println(printedLine); } } }
额外优化说明
- 加入
toUpperCase()统一处理输入的小写字母,避免大小写不匹配问题。 - 用
substring直接截取字符对应的L长度片段,比逐个字符拼接更简洁高效。 - 非字母字符默认用A的样式,可根据题目要求修改(比如样式包含?的话,将
charIndex设为26即可)。
内容的提问来源于stack exchange,提问作者Fapou9
相关产品推荐
相关产品推荐

