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

C语言使用紧凑指针访问二维数组实现摩尔斯码的问题求助

C语言摩尔斯码指针访问错误解决方案

核心错误点

  • 命名笔误:定义的数组名为morseKey,指针赋值时误写为morseCode,直接导致指针指向非法地址
  • 遍历逻辑错误:++*cp操作是修改当前行字符串的起始指针,并未移动cp指向数组下一个元素,永远无法遍历到后续行
  • 数组初始化问题:声明了长度为37的指针数组,仅初始化26个元素,剩余元素为野指针;且数组内重复定义了两次L的摩尔斯码
  • 指针访问逻辑混淆:char *morseKey[]是字符串指针数组,cp++才是移动到下一行字符串,(*cp)++是移动当前行的字符指针

修正代码实现

1. 修正数组定义

// 不指定固定长度,由编译器自动计算元素数量,末尾加NULL作为遍历结束哨兵
char *morseKey[] = { 
    "A.-",
    "B-...",
    "C-.-.",
    "D-..",
    "E.",
    "F..-.",
    "G--.",
    "H....",
    "I..",
    "J.---",
    "K-.-",
    "L.-..",
    "M--",
    "N-.",
    "O---",
    "P.--.",
    "Q--.-",
    "R.-.",
    "S...",
    "T-",
    "U..-",
    "V...-",
    "W.--",
    "X-..-",
    "Y-.--",
    "Z--..",
    NULL
};

2. 指针式匹配与遍历实现

// 遍历输入字符串逐字符转摩尔斯码
for(char *cp_nameCode = nameCode; *cp_nameCode != '\0'; cp_nameCode++) {
    char target = toupper(*cp_nameCode);
    char **cp = morseKey;
    char *morse_str = NULL;
    // 指针遍历匹配对应字母
    while (*cp != NULL) {
        if (**cp == target) { // **cp取当前行第一个字符(即存储的字母)
            morse_str = *cp + 1; // 跳过首字母,直接拿到摩尔斯码串的起始地址
            break;
        }
        cp++; // 移动到数组下一个元素(下一行字符串)
    }
    if (morse_str == NULL) continue; // 未匹配到跳过
    // 遍历摩尔斯码串执行闪灯
    while (*morse_str != '\0') {
        *morse_str == '.' ? dot() : dash();
        morse_str++; // 移动到当前串下一个字符
    }
}

原遍历逻辑修复

如果要保留你原来的双层遍历数组的写法,修正后的代码如下:

char **cp = morseKey;
while (*cp != NULL) {
    char *cp_row = *cp; // 每次取当前行的字符串指针
    while (*cp_row != '\0') {
        printf("%c\n", *cp_row++);
    }
    cp++; // 移动到下一行
}

内容的提问来源于stack exchange,提问作者embedded3d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:36:03