我有一个编码器-解码器代码,它使用最后带有“\n”的空格的单词转储作为输入,并对文本中出现的前 5 个单词进行编码,反之亦然。它似乎很有魅力,但我的主管程序仍然给出了 10 次失败的 6 次。我对输入文件进行编码,然后对编码的输入文件进行解码,并且效果很好。仍然不明白它有什么问题。拜托,伙计们,我需要你的眼睛!
简单编码器在文件中找到 5 个最常见的 - 至少 3 个字符长的 - 单词,并用短代码替换它们。代码长度为 2 个字符,如下所示:!1 !2...!5。!1 替换文本中出现次数最多的单词,!5 替换出现次数最少的单词。如果两个单词出现相同的情况,则第一个单词在代码列表中排在第一位(“越快越好”)。其余的词必须保持不变。在编码文件的开头,必须显示编码列表。该程序还必须具有解码功能。如果输入以“!”开头,则它必须调整编码列表,并解码整个文件,恢复原始状态。输入:可以存在两种输入文件。原始输入最多包含 2000 个单词,中间有空格,每个单词最多 22 个字符。在最后一个单词之后,没有空格,而是换行符(“\n”)。单词由英文字母组成,全部小写。没有一个词包含任何“!” 符号。总是至少有 5 种不同类型的单词,至少有 3 个字符。警告!如果输入格式等于输出格式,当然需要解码!在解码的情况下,2000 字和 22 字符的限制在文件开头的编码列表中当然是有效的。输出:前 5 行包含代码表。第一个词是代码,旁边是它正在替换的词。替换词后的换行符之间的空格。从第 6 行开始,是需要解码的编码文本。单词之间有空格,最后只有一个换行符。警告!输出文件格式可以等于输入文件格式!在这种情况下,当然需要编码。
要求:“input.txt”用于读取(只读!)和“output.txt”(只写!)用于写入。运行成功,返回0;在 main() 的末尾是避免错误代码所必需的。可能的故障代码:超出内存时间限制;浮点数失败,fe:除以零。内存访问失败、数组过度索引、使用空指针。
/* Input.txt
o xxa o xxb xxb o xxc o xxd xxb xxe xxe
Output.txt
!1 xxb
!2 xxe
!3 xxa
!4 xxc
!5 xxd
o !3 o !1 !1 o !4 o !5 !1 !2 !2 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct words {
char *kod;
int occurrence;
} TABLE;
int main() {
FILE *data;
char wordmax[23];
TABLE *table = NULL;
int number = 0, i, m, n;
char c;
data = fopen("be.txt", "r" );
c = fgetc(data);
FILE *outfile;
outfile = fopen("ki.txt", "w");
int first = 1;
char codeReadIn[10][23];
if ( c == '!' ) {
data = fopen("be.txt", "r" );
for ( i = 0; i<10; i++){
fscanf(data, "%s", codeReadIn[i]);
}
while (fscanf(data, "%s", wordmax) != EOF ) {
if (first == 0){
fprintf(outfile, " ");
}
if (first == 1){
first = 0;
}
for (m=0; m<10; m = m + 2) {
if (strcmp(wordmax, codeReadIn[m]) == 0) {
fprintf(outfile, "%s", codeReadIn[m+1]);
break;
}
}
if (m==10) {
fprintf(outfile, "%s", wordmax);
}
}
fprintf(outfile, "\n");
} else {
data = fopen("be.txt", "r" );
while (fscanf(data, "%s", wordmax) != EOF ) {
for (i = 0; i < number; ++i){
if (strcmp(table[i].kod, wordmax) == 0){
break;
}
}
if (strlen(wordmax) <= 2){ // 2 char skip
continue;
}
if (i == number) {
++number;
table = (TABLE *)realloc(table, number * sizeof(TABLE));
table[i].kod = (char *)malloc((strlen(wordmax) + 1) * sizeof(char));
strcpy(table[i].kod, wordmax);
table[i].occurrence = 1;
}else{
++table[i].occurrence;
}
}
int maxOccurrences[5];
char* maxCodes[5];
int j, k ;
for(j = 0; j < 5; j++){ // search for the top5 among occurrences
maxOccurrences[j] = -1;
for (i = 0; i < number; ++i){ // going trough occurrences
// once put in top5, wont put it in again
int foundone = 0;
for (k = 0; k < j; k++){
if ( strcmp(maxCodes[k], table[i].kod) == 0){
foundone = 1;
}
}
if(foundone == 1){
continue;
} // search for max
if ( table[i].occurrence > maxOccurrences[j] ) { // if bigger then better
maxOccurrences[j] = table[i].occurrence;
maxCodes[j] = table[i].kod;
}
}
}
char* kod[5];
kod[0] = "!1";
kod[1] = "!2";
kod[2] = "!3";
kod[3] = "!4";
kod[4] = "!5";
for (i=0;i<5;i++) {
fprintf(outfile, "%s %s\n", kod[i], maxCodes[i]);
}
int m;
data = fopen("be.txt", "r" );
first = 1;
while (fscanf(data, "%s", wordmax) != EOF ) {
if(first == 0){
fprintf(outfile, " ");
}
if(first == 1){
first = 0;
}
for (m=0; m<j; m++) {
if (strcmp(wordmax, maxCodes[m]) == 0) {
fprintf(outfile, "%s", kod[m]);
break;
}
}
if (m==j) {
fprintf(outfile, "%s", wordmax);
}
}
fprintf(outfile, "\n");
for (i=0;i<number;++i){
free(table[i].kod);
}
free(table);
}
fclose(data);
fclose(outfile);
return 0;
}