C ++程序在奇怪的输入上崩溃

时间:2013-06-16 00:21:14

标签: c++ string

我编码霍夫曼压缩,它适用于所有扩展的ascii(0-255),但当我打开像mp3这样的非文本文件时,就像在里面那样:

  

ťîxł¸H... W]`9MČȢŁ¤Ąxw

它崩溃了。我测试过,并不是因为它的大小,因为输入数据。

它在文件保存时崩溃,继承代码:

for(int i=0;i<=contents.length();i++){
    newString +=kod[contents[i]];
}
saveFile("test_nowy.txt", newString);

bool saveFile (string name, string contents)
{
    ofstream file;
    file.open(name.c_str());
    file << contents;
    file.close();

}

我还需要说,尽管通过了所有早期步骤(计算代码等),但结果是错误的。好像我的程序不理解那些字符。

3 个答案:

答案 0 :(得分:6)

您正在访问未定义行为字符串的边界。

for(int i=0;i<=contents.length();i++)
             ^^

应该是:

for(int i=0;i<contents.length();i++)
             ^^
顺便说一句,这是学习调试器的好时机。捕获程序崩溃的确切位置并找出原因。

答案 1 :(得分:2)

您正在访问kod数组的负索引。尝试

kod[contents[i] & 0xFFu]

请参阅http://ideone.com/2LvmKW

还要修复billz发现的超支。

答案 2 :(得分:0)

你说它适用于0..255的所有字符,但不适用于这些字符,这意味着你使用的不是8位字符。如果是这样,你可能正在索引范围之外。