RISC-V字符串首字符大写判断问题:无法获取首字符求助
问题分析与修正
核心错误点
- 获取首字符的逻辑完全错误:系统调用
li a7,8(读取字符串)执行后,输入的字符串已经存储在string缓冲区中,a1是你指定的缓冲区最大长度,不是读取到的字符。你用sb a1, 0(s1)是把缓冲区长度写到字符串首地址,完全覆盖了输入的首字符,自然无法正确获取。 - 错误使用输出系统调用:
li a7,4是输出字符串的调用,要求a0是字符串的起始地址,但你把a0设为a1(缓冲区长度),这会把数值当作内存地址去读取,必然输出乱码。如果要测试首字符,应该用a7,11(输出单个字符)的系统调用。 - 条件判断未正确实现:你注释的代码逻辑和判断大写字母的需求不匹配,需要针对ASCII码范围做判断。
修正后的完整代码
.data enterString: .string "Enter a string: " isUpperCase: .string "The first character is an upper-case letter\n" notUpperCase: .string "The first character is not an upper-case letter\n" string: .space 82 ; 足够的缓冲区空间 .text main: ; 提示输入字符串 li a7, 4 la a0, enterString ecall ; 读取字符串到string缓冲区,最大长度20 li a7, 8 addi a1, zero, 20 la a0, string ecall ; 读取字符串的首字符 la s1, string lb t0, 0(s1) ; 从string首地址加载1字节(首字符)到t0 ; 测试首字符是否为大写字母(ASCII 'A'=65, 'Z'=90) li t1, 'A' li t2, 'Z' blt t0, t1, print_not_upper ; 小于'A',不是大写 bgt t0, t2, print_not_upper ; 大于'Z',不是大写 ; 是大写字母的情况 li a7, 4 la a0, isUpperCase ecall j exit_program ; 跳转到退出 print_not_upper: li a7, 4 la a0, notUpperCase ecall exit_program: li a7, 10 ecall
关键修改说明
- 正确获取首字符:用
lb t0, 0(s1)从缓冲区首地址加载1字节,得到输入字符串的第一个字符。 - 修正输出逻辑:重新定义了更清晰的结果字符串,避免原变量名的逻辑混淆。
- 实现大写字母判断:通过比较首字符的ASCII码是否在
'A'到'Z'之间,分支到对应的结果输出。 - 优化程序流程:用
j指令跳转到统一的退出入口,避免重复的li a7,10代码。
内容的提问来源于stack exchange,提问作者David D'Silva
相关产品推荐
相关产品推荐

