C 编码-解码-查找故障请

C 编码-解码-查找故障请,c,arrays,struct,scanf,printf,C,Arrays,Struct,Scanf,Printf,我有一个编码器-解码器代码,它将带有结尾带有“\n”的空格的字转储作为输入,并对文本中出现的前5个字进行编码,反之亦然。它似乎很有魅力,但我的主管程序仍然给出了10次失败中的6次。我对输入文件进行编码,然后对编码后的输入文件进行解码,它工作得非常完美。我还是不明白它出了什么问题。伙计们,我需要你们的眼睛 简易编码器 在一个文件中找到5个最常见的单词(至少3个字符长),并用短代码替换它们。 代码长度为2个字符,如下所示:!1.2.5.1将该单词替换为文本中出现次数最多的单词,并且!5用出现次数最少

我有一个编码器-解码器代码,它将带有结尾带有“\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”(writeonly!)用于写入。对于成功运行,返回0;main()的末尾是避免错误代码所必需的。可能的故障代码:内存-超出时间限制;浮点失败,例如:用零除。;内存访问失败、数组过度索引、使用空指针

/* 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;
}
/*Input.txt
o xxa o xxb xxb o xxc o xxd xxb xxe
Output.txt
!1 xxb
!2 xxe
!3 xxa
!4 xxc
!5 xxd
啊!三点!1.一点!四点钟!5.1.2.2 */
#包括
#包括
#包括
typedef结构字{
char*kod;
int发生;
}表;
int main(){
文件*数据;
char-wordmax[23];
TABLE*TABLE=NULL;
整数=0,i,m,n;
字符c;
数据=fopen(“be.txt”,“r”);
c=fgetc(数据);
文件*输出文件;
outfile=fopen(“ki.txt”,“w”);
int first=1;
char codeReadIn[10][23];
如果(c=='!'){
数据=fopen(“be.txt”,“r”);

对于(i=0;i为什么你忽略一两个字母的单词

if (strlen(wordmax) <= 2){  // 2 char skip
       continue;
    }
为什么“一”排在最后?这是个问题吗

输入:
aaa bbb ccc ddd eee

输出:

!1 two
!2 three
!3 four
!4 five
!5 one
!5 !5 !1 !1 !2 !2 !3 !3 !4 !4
!1 bbb
!2 ccc
!3 ddd
!4 eee
!5 ^A
aaa !1 !2 !3 !4
那里发生了一些奇怪的事情

输入:
xxx yyy zzz


输出:总线错误

显示您的代码失败的测试用例。我不能。我必须将.c文件上传到supervisor服务器,它会立即给我结果,如001011010-1表示一切正常,0表示结果不好,我表示编码或解码不好。每个字节的结果必须与参考fi相同les,我不知道,因为他们在supervisor服务器上。你试过一些角落案例吗?如果输入文件只包含
\n
,会发生什么情况?是的,很好的建议,但任务回顾说,总是有至少5种类型的单词,最多2000个单词,每个最多22个字符。我花了半天时间创建输入files失败。我不能失败。10次中仍有6次在主管身上失败。他们需要跳过。忘记提及,请查看我编辑的示例!全部小写。事实上,我意识到我发布的这个问题非常不准确。对不起。是的,我看到了你的失败案例,这就是我想要的!!!4谢谢,我在上面。是的,这是一个问题,如果two单词出现的次数相同,第一行必须是“较大”。