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

