C语言实现TXT摩尔斯电码转英文时仅读取单个字符的问题求助
摩尔斯电码转英文代码故障排查
我用C语言写了一段从TXT文件读取摩尔斯电码(仅由'-'、'.'、' '组成)并转换为英文的代码,但程序只读取单个字符就停止,无法完成转换。我的思路是把单个摩尔斯“字母”存入字符串后传给convertToLetter函数,但运行后只打印了一次数字1,求解决办法。
char convertToLetter(M* data, char word[10]) { int size = 0; char correct; while (size < 60) { int compare = strcmp(word, data->morse); if (compare == 0) { correct = data->letter; } data++; size++; } correct = '\0'; return correct; } int main(){ //some code here for opening a file. char curSent[200]; char letter[6] = ""; int i = 0; char* fullString = (char*)malloc(1000 * sizeof(char)); fullString[0] = '\0'; while (fgets(curSent, 200, inFile) != NULL) { if (curSent[0] != '\n') { curSent[strlen(curSent) - 1] = '\0'; strcat_s(fullString,1000, curSent); } else { printf("%s", fullString); printf("\n\n"); int j = 0; while (i < strlen(fullString)) { if (fullString[i] != ' ') { fullString[i] = letter[j]; i++; j++; printf("%d \n", 1); }else if (fullString[i + 1] == ' ' && fullString[i] == ' ') { printf("%d", 2); printf(" %c", convertToLetter(dictionary, letter)); memset(letter, 0, strlen(letter)); j = 0; i = i + 2; }else if (fullString[i] == ' ') { printf("%d", 3); printf("%c", convertToLetter(dictionary, letter)); memset(letter, 0, strlen(letter)); j = 0; i = i++; } } memset(fullString, 0, strlen(fullString)); i = 0; } } //printf("%s", fullString); getchar(); return 0; }
问题分析与修复方案
1. convertToLetter函数逻辑错误
函数末尾强制将correct设为'\0',无论是否找到匹配的字母,都会返回空字符;且未找到匹配时correct未初始化,属于未定义行为。修复如下:
char convertToLetter(M* data, char word[10]) { int size = 0; // 初始化默认返回值,用'?'表示未匹配 char correct = '?'; while (size < 60) { int compare = strcmp(word, data->morse); if (compare == 0) { correct = data->letter; // 找到匹配后直接跳出循环,无需继续遍历 break; } data++; size++; } return correct; }
2. 摩尔斯字符存储逻辑颠倒
原代码执行fullString[i] = letter[j];,是空数组letter覆盖fullString的内容,完全搞反了数据流向。应该将fullString中的摩尔斯字符存入letter:
if (fullString[i] != ' ') { // 将当前摩尔斯字符存入letter数组 letter[j] = fullString[i]; // 手动添加字符串结束符,避免strcmp读取垃圾值 letter[j+1] = '\0'; i++; j++; printf("%d \n", 1); }
3. 循环变量i更新错误
i = i++;属于未定义行为,直接改为i++即可:
}else if (fullString[i] == ' ') { printf("%d", 3); printf("%c", convertToLetter(dictionary, letter)); // 用sizeof更安全,避免letter为空时strlen返回0导致memset无效 memset(letter, 0, sizeof(letter)); j = 0; i++; // 直接自增 }
4. 遗漏文件末尾剩余内容处理
原代码仅在遇到空行时处理转换,若文件末尾无空行,最后一段摩尔斯电码会被忽略。需在循环结束后补充处理逻辑:
// 处理文件末尾未被处理的剩余内容 if (strlen(fullString) > 0) { int j = 0; while (i < strlen(fullString)) { if (fullString[i] != ' ') { letter[j] = fullString[i]; letter[j+1] = '\0'; i++; j++; }else if (fullString[i + 1] == ' ' && fullString[i] == ' ') { printf(" %c", convertToLetter(dictionary, letter)); memset(letter, 0, sizeof(letter)); j = 0; i += 2; }else if (fullString[i] == ' ') { printf("%c", convertToLetter(dictionary, letter)); memset(letter, 0, sizeof(letter)); j = 0; i++; } } // 处理最后一个未被转换的摩尔斯字母 if (j > 0) { printf("%c", convertToLetter(dictionary, letter)); } }
5. 优化letter数组初始化
char letter[6] = "";可正常工作,但显式初始化所有元素更稳妥,避免残留垃圾值:
char letter[6] = {0};
内容的提问来源于stack exchange,提问作者Yakov Fainshetin
相关产品推荐
相关产品推荐

