2017-04-13 101 views
0

我正在使用C语言编写一个密码项目。我必须编写9个具有多个加密/解密目的的函数。该函数应该能够读取'message.txt'文件中的文本,对消息进行加密/解密(取决于用户输入),然后将结果写入该函数创建的新'code.txt'文件中。用户将给出他想要的一个键(谱号)和模式(密码/解密),该功能将根据Vigenère方法中的另一个密码/解密函数执行。这是我的代码,(有些部分是西班牙语,我很抱歉)首先是密码/解密的功能,然后是读取/写入文件,然后是main()。 (IF MODE == 0 FUNCTION DECIPHERS)。文件写入问题

#include <string.h> 
#include <stdio.h> 

int vigenereCipher(char *chaine, char *key, char *code, int mode) 
{ 
    int i = 0, c = 0; 

    if (mode != 0) { 
     for (; i < strlen(chaine); i++) { 
      if (chaine[i] + key[c] < 256) { 
       code[i] = chaine[i] + key[c]; 
       c += 1; 
      } else { 
       code[i] = chaine[i] + key[c] - 256; 
       c += 1; 
      } 

      if (c == strlen(key)) { 
       c = 0; 
      } 
     } 
    } else { 
     for (; i < strlen(chaine); i++) { 
      if (chaine[i] - key[c] < 0) { 
       code[i] = chaine[i] - key[c]; 
       c += 1; 
      } else { 
       code[i] = chaine[i] - key[c] + 256; 
       c += 1; 
      } 

      if (c == strlen(key)) { 
       c = 0; 
      } 
     } 
    } 

    printf("\n %s -> %s \n", chaine, code); 
    if (*chaine == *chaine) { 
     printf("\n0\n"); 
    } else { 
     printf("\n1\n"); 
    } 
} 

int encryptTextFile(char *key, int mode) 
{ 
    char chaine[99999]; 
    char code[99999]; 
    int i; 
    FILE *archivo1, *archivo2; 

    archivo1 = fopen("message.txt", "r"); 
    archivo2 = fopen("code.txt", "w"); 

    fscanf(archivo1, "%s", chaine); 

    vigenereCipher(chaine, key, code, mode); 

    for (i = 0; i < strlen(chaine); i++) { 
     fprintf(archivo2, "%c", code[i]); 
    } 

    fclose(archivo1); 
    fclose(archivo2); 
} 

int main() 
{ 
    char key[99999]; 
    int mode; 

    printf("Enter encryption key: "); 
    gets(key); 

    printf("Enter desired mode (1 or 0): "); 
    scanf("%i", &mode); 

    encryptTextFile(key, mode); 
} 

此功能可以加密/解密正确的,但是,当它试图写入结果在“code.txt”文件不写相同的加密/解密字符之前给了。

我该如何纠正这个问题,以便它将相同的字符写入'code.txt'文件中? 谢谢。 (请让我知道你是否需要翻译成英文。)

+3

在'chiffrementVigenere'你在哪里终止你建立的字符串? –

+3

您的代码从MSVC生成6个编译器警告。三个涉及有符号/无符号整数比较。一个人建议'get'已经过时了。两个建议函数在它们应该返回时不返回任何值。请启用所有编译器警告。 –

+0

'请启用所有编译器警告'并在继续之前修复这些问题 – KevinDTimm

回答

0

strlen使用第一个来确定长度。所以一个密码字符串可以被错误地缩短strlen

因此,您需要其他字符串表示形式,考虑存储大小的字节块。

+0

非常感谢,我已经解决了这些问题,还有文件写入错误。 –