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

C++摩尔斯码转文本程序报0xC0000005错误,求故障排查方法

解决摩尔斯码转文本程序的0xC0000005访问违规错误

错误码0xC0000005是Windows系统下的内存访问违规,说白了就是你的程序在尝试访问它没权限碰的内存区域。咱们一步步揪出代码里的问题:

核心问题拆解

  • 未初始化的变量c:你在main里定义了int c,code;但没给c赋值就直接用words[c] += to_translate[a];。c的初始值是随机的,这会导致你往words数组的随机位置写数据,大概率触发内存越界,这是导致错误的头号原因。
  • sizeof的错误使用:
    • sizeof(to_translate)返回的是整个数组的字节数(1000),但你输入的字符串长度肯定比这短,循环到1000会处理大量空字符,甚至越界。应该用strlen(to_translate)获取实际输入的字符串长度。
    • sizeof(words)是string words[1000]的总字节数(不是1000个元素),因为每个string对象本身占一定内存。要获取元素个数得用sizeof(words)/sizeof(words[0]),否则循环次数会远超数组实际大小,触发访问违规。
  • find_position函数无默认返回值:如果传入的摩尔斯码不在数组里,函数没有return语句,会返回一个随机值,后续转成字符时可能引发异常。
  • 错误输出words2:cout << words2;只会输出数组的内存地址,而不是转换后的文本,需要循环遍历输出每个元素。
  • 单词分隔逻辑漏洞:你想用/分隔单词,但当前代码把每个空格分隔的部分存到words里,输入里的/会被当成独立元素,处理时需要添加空格而非单纯c++。

修正后的完整代码

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

int find_position(string toFind){
    string codes[26]={ ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.." };
    for(int a=0;a<26;a++){
        if(codes[a]==toFind){
            return a;
        }
    }
    // 找不到返回无效值,后续可做错误处理
    return -1;
}

int main(){
    cout << "Enter the code(separate with space, use / for word separation): ";
    char to_translate[1000];
    cin.getline(to_translate,1000);
    
    int c = 0; // 必须初始化c为0
    string words[1000];
    int len = strlen(to_translate); // 获取实际输入长度
    for(int a=0;a<len;a++){
        if(to_translate[a]!=' '){
            words[c] += to_translate[a];
        }else{
            // 避免连续空格生成空元素
            if(!words[c].empty()){
                c++;
            }
        }
    }
    // 把最后一个有效元素计入统计
    if(!words[c].empty()){
        c++;
    }

    string words2[1000];
    c=0;
    for(int a=0;a<1000;a++){
        // 遇到空元素就停止循环
        if(words[a].empty()){
            break;
        }
        if(words[a]=="/"){
            // 单词分隔时添加空格
            words2[c] += ' ';
        } else{
            int pos = find_position(words[a]);
            if(pos != -1){ // 只处理有效的摩尔斯码
                words2[c] += (char)(pos + 65); // 65对应'A'的ASCII码,之前的64会得到'@',是错误的
            }
        }
    }

    // 输出转换后的文本
    cout << "Translated text: " << words2[0] << endl;
    return 0;
}

额外优化说明

  • 把64改成了65,因为pos是0-25,加65才对应'A'-'Z',之前的64会得到符号而非字母。
  • 添加了空元素判断,避免处理无效的空字符串。
  • 给find_position加了默认返回值-1,可以在后续判断是否为有效摩尔斯码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:45:49