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
相关产品推荐
相关产品推荐

