- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题是我第一次可以解码一个数据流,但之后它会变成一个无限循环并一遍又一遍地显示相同的值...我使用的是borland C++。解码是通过首先将文本 a 到 z 保存在一个数组中,然后获取输入数据流,然后使用 strcpy 切割数组的内容然后与第一个数组的内容进行比较,如果找到匹配项,则相应的 ASCII被打印出来。
代码:
#include<conio.h>
#include<iostream.h>
#include<string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int codes[512];
char cut_stream[100];
char input_stream[100];
char decoded_stream[256];
int test,count,cut_start,cut_end,length_of_stream,final,temp_loop_s,temp_loop_e,temp_num,comp_num,send;
void select_num(int select)
{
int output;
output = select + 64;
cout << char(output);
}
void decode()
{
cout<<"\nEnter the data stream ";//<<endl;
cin >> input_stream;
length_of_stream = strlen(input_stream);
//cout<< length_of_stream ; //only for debugging
/********************************************
the code starts here...
********************************************/
count = length_of_stream;
//count -= count;
for(int ini =0; ini<=count ; ini++)
{
for( final=1;final<=count;final++)
{
strncpy(cut_stream, &input_stream[ini], final);
//cut_start = cut_start + 1;
/*********************************************
compare
*********************************************/
temp_num = atoi(cut_stream);
for(int z= 1;z<=26;z++)
{
comp_num = codes[z];
if(comp_num == temp_num)
{
send =z;
select_num(send);
test =1;
comp_num =0;
break;
}
}
if( test ==1)
{
test =0;
ini = final-1; // the increment will be given on the next for loop so it is reduced here
//final =0;
//cout<< "im in test";
break;
}
}
}
cout<< "end";
while(1);
}
//cout<< decoded_stream;
//while(1);
void main()
{
cut_start =0;
cut_end = 1;
cout << "Huffman decoder" << endl;
cout << "Enter the codes for a-z" << endl;
for(int i =1;i<=3;i++)
{
cin >> codes[i];
}
decode();
}
最佳答案
代码中至少有两个主要错误:
codes[] 数组大部分是未初始化的,即使您稍后访问该数组的索引最多为 26 左右,您也只能读取三个数字。
在 strncpy() 复制最大字符数时不会以 null 终止字符串的意义上,对 strncpy() 的调用被破坏;也就是说,当您调用 strncpy() 并将 final 设置为 1 时,strncpy() 会复制一个字符并且不会附加终止 NUL 字符,这将导致 atoi() 失败。
此外,如果您在霍夫曼编码中使用“0”和“1”字符,这无论如何都不起作用,因为数字“01”和“1”都将被 atoi() 解释为 1(一)即使它们是不同的代码。如果这真的是哈夫曼编码,你根本不应该使用 atoi() 和整数,而应该使用二进制或字符串。
霍夫曼解码最好使用树数据结构来完成。查找有关算法的任何标准书籍以供引用。
关于c++ - 霍夫曼解码快疯了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328261/
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我这样定义了一个二叉树: struct btree { int x; btree* left_child = nullptr; btree* right_child = nul
我有这个霍夫曼代码,旨在返回数组中每个字母的霍夫曼代码并按字母顺序打印它们。问题是它不生成任何输出,而是继续处理,直到我手动退出它。谁能帮我找出错误吗?我认为我的代码是正确的,但我不知道无限循环从何而
动机 想象一下一个哈夫曼压缩文件被部分下载,就像在p2p软件中一样,所以我们首先为整个文件分配磁盘空间,然后开始随机下载文件块。其中一个哈夫曼密码(但我们不知道是哪一个)是一个结束密码,所以如果这个密
以下 block 由霍夫曼 block 标记嵌套 -HUFF---------------------------------------------------------------------0
我是一名优秀的程序员,十分优秀!