0

所以我的解密程序似乎无法找到密钥并自行实现。我注意到,如果我将密钥更改为等于 -5 这是正确的密钥,它将正确打印出解密的文本。但是,我无法弄清楚如何让程序自行解决,而无需我手动将其放入。任何帮助将不胜感激!谢谢!

rotUtils.h

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#include "rotUtils.h"

int rotate(int c, int n){
  if (n == 0) return c;
  int nRot = abs(n) % (RANGECHAR + 1);
  if(n > 0)
    return rotatePlus(c + nRot);
  else
    return rotateMinus(c - nRot);
}

int rotatePlus(int sum){
  int diff = sum - MAXCHAR;
  if (sum > MAXCHAR) sum = MINCHAR + diff - 1;
  return sum;
}

int rotateMinus(int sum){
  int diff = MINCHAR - sum;
  if (sum < MINCHAR) sum = MAXCHAR - diff + 1;
  return sum;
}

解密.cpp

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "rotUtils.h"

bool solved( char decodearr[], char dictarr[][30], int size1, int size2){

    char* compared;
    bool result = false;

    for(int j = 0; j < size2; j++){

    compared = strstr( decodearr, dictarr[j]);

    }
    if( compared != '\0'){

     result = true;

         }
    return result;

}

int decode( char codearr[], char dictarr[][30], int size1, int size2)
    {
    bool solution = false;
    int key = -50; This is where I had to change it to -5 to solve 

    char decodearr[10000];
    while(solution == false && key < 51)
    {
     for( int i = 0; i < size1; i++)
        {
        if(!isspace(codearr[i]))
         {
          decodearr[i] = rotate(codearr[i], key);
          }
        else
          decodearr[i] = codearr[i];


    }

    solution = solved( decodearr, dictarr, size1, size2);
    if( solution == false)
     {
      key++;
      }
    }

  for( int j = 0; j < size1; j++)
    {
    codearr[j] = decodearr[j];
    }
  return key;
}

    int main( int argc, char* argv[])
    {
    char* file = argv[1];
    char* dictionary = argv[2];
    char code[10000];
    char dict[30000][30];
    FILE* codeFile;
    codeFile = fopen(file, "r");
    int i = 0;
    int j = 0;
    int key;
    FILE* dictFile;
    dictFile = fopen(dictionary, "r");

    while(!feof(codeFile))
    {
    code[i] = fgetc(codeFile);
    i++;
    }

    code[ i ]= '\0';
    fclose(codeFile);

    while(!feof(dictFile))
    {
    fscanf(dictFile, "%s", dict[j]);
    j++;
    }

    key = decode(code, dict, i, j);
    fclose(dictFile);

        for(int k = 0; k < i; k++)
        {
        printf("%c", code[k]);
        }

    printf( "\nThe key is: %d\n", key);

    return 0;
}
4

1 回答 1

0

Solved() 仅在当前字典的最后一个单词匹配时才返回 true,您必须将该检查移到里面。每当您在字典中找到匹配的键时,您都可以打印到屏幕上和/或保留可能的键列表,然后在您完成所有键后打印,现在您会在找到任何匹配项后立即退出,即使这只是运气。

于 2015-03-30T05:57:40.670 回答