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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:45:44