如何逐个遍历字符串字符并通过if判断?代码返回值异常排查
问题分析与修复
你的代码存在几个关键错误,直接导致返回值不符合预期:
参数类型不匹配(核心问题)
调用brail_print(A[j])时,传入的是单个char字符,但brail_print的参数定义为char *(字符串指针)。这会把字符的ASCII数值当作内存地址传入函数,strcmp会尝试访问这个非法地址做字符串比较,行为完全不可控,返回结果自然混乱。错误使用字符串比较函数
strcmp是用来比较两个字符串的,而你要判断的是单个字符,直接用==比较字符值就可以,没必要用strcmp。变量作用域问题
HEX数组定义在brail_print内部,外部代码SOL_Port = HEX[port_val];根本访问不到这个数组,编译时会报错或者触发未定义行为。逻辑冗余错误
brail_print返回的已经是HEX数组里的十六进制值,你却又用它当索引去取不存在的外部HEX数组的值,完全是多余操作,直接把返回值赋值给SOL_Port即可。
修正后的代码
// 将HEX数组放在全局作用域,确保所有需要的函数都能访问 unsigned char HEX[] = {0x01,0x03,0x09,0x19,0x11,0x0B,0x1B,0x13,0x0A,0x1A,0x05,0x07,0x0D,0x1D,0x15,0x0F,0x1F,0x17,0x0E,0x1E,0x25,0x27,0x3A,0x2D,0x3D,0x35}; // 修改函数参数为char类型,匹配传入的单个字符 unsigned int brail_print(char character){ unsigned int hexval = 0; if (character == 'a' || character == 'A'){ hexval = HEX[0]; } else if (character == 'b' || character == 'B'){ hexval = HEX[1]; } else if (character == 'c' || character == 'C'){ hexval = HEX[2]; } // 继续补充d到z的判断逻辑,格式和上面一致 return hexval; } // 主逻辑部分 char A[] = "abcdefghijklmnopqrstuvwxyz"; int j; for (j=0; A[j] != 0; j++){ unsigned int port_val = brail_print(A[j]); SOL_Port = port_val; // 直接使用返回的十六进制值 // 这里可以添加SOL_Port的使用逻辑,比如打印或输出到硬件端口 }
进一步优化建议
写26个else if太繁琐,利用字母的ASCII码规律可以简化代码:
#include <ctype.h> // 需要包含头文件来使用tolower函数 unsigned int brail_print(char character){ // 先把字符转成小写,统一判断逻辑 char lower_char = tolower(character); // 判断是否是小写字母 if (lower_char >= 'a' && lower_char <= 'z'){ // 计算字母在数组中的索引:a对应0,b对应1...z对应25 int index = lower_char - 'a'; return HEX[index]; } // 非字母字符返回默认值0,也可以根据需求修改 return 0; }
内容的提问来源于stack exchange,提问作者Mihiranga Silva
相关产品推荐
相关产品推荐

