You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何逐个遍历字符串字符并通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:45:41