加密一个简单的数组

问题描述:

对于我必须做的实验,我需要创建一个程序,它将从文本文件中获取一个简单的字符串,并使用一个键进行加密 - 一个介于0和255之间的数字。它将读取将该文件转换为数组,并通过将每个字节与密钥异或来将该数组加密(或解密)为另一个数组。最后,它将修改后的数组写入第二个文件。加密一个简单的数组

我主要得到它 - 我在下面编译得很好。但是,它不会将任何内容复制到第二个文件。帮帮我!

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define CRYPT(a, b) (a^b) 

int main(int argc, char *argv[]) 
{ 
    FILE *fp1, *fp2; 
    int a[100], b, key; 
    int i = 0; 

    // opens file containing string to be encrypted 
    if((fp1 = fopen(argv[2], "rb")) == NULL) 
    { 
      printf("Error - could not open file or file does not exist\n"); 
      return; 
    } 

    // opens file encrypted string will be saved to 
    fp2 = fopen(argv[3], "wb"); 

    // converts string to integer 
    key = atoi(argv[1]); 

    while(fread(a, sizeof(a), 100, fp1)) 
    { 
      while (i != '\0'); 
      { 
        b = CRYPT(a[i], key); 
        fwrite(&b, sizeof(a), 1, fp2); 
        i++; 
      } 
    } 


    return 0; 

}

我认为问题就出在这里 -

while (i != '\0'); 

要初始化i为0,并且在while循环要检查我是否不等于NULL。整数值NULL\0为0.因此,该表达式为false,并且您的循环从不被执行。

还在此while循环结束时删除多余的分号。

reference -

为size_t的fread(无效* PTR,为size_t大小,为size_t计数,FILE *流);

读取的计数元件的阵列,每一个的尺寸为大小字节,从由PTR指定的,并将它们存储在存储器的块。 流的位置指示符超前读取的总字节数。 成功读取的字节总数量是(size * count)。

所以你还需要你的fread功能改变这一点 - 同样

fread(a, sizeof(int), 100, fp1) 

,你还需要改变你的fwrite -

fwrite(&b, sizeof(int), 1, fp2); 

编辑的代码应该是这个样子 -

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define CRYPT(a, b) (a^b) 

int main(int argc, char *argv[]) 
{ 
    FILE *fp1, *fp2; 
    int a[100], b, key; 
    int i = 0; 
    int data_read = 0; 

    // opens file containing string to be encrypted 
    if((fp1 = fopen(argv[2], "rb")) == NULL) 
    { 
      printf("Error - could not open file or file does not exist\n"); 
      return; 
    } 

    // opens file encrypted string will be saved to 
    fp2 = fopen(argv[3], "wb"); 

    // converts string to integer 
    key = atoi(argv[1]); 

    while((data_read = fread(a, sizeof(int), 100, fp1)) > 0) 
    { 
      while(i < data_read) 
      { 
        b = CRYPT(a[i], key); 
        fwrite(&b, sizeof(int), 1, fp2); 
        i++; 
      } 

      i=0; 
    } 

    return 0; 
} 
+0

啊,我把它改成'while(!feof(fp1));',但这仍然没有任何帮助。 – 2012-03-18 06:53:19

+2

另外,在该行末尾的额外分号并没有帮助... – 2012-03-18 06:54:46

+0

@ ThomasPadron-McCarthy:好! – 2012-03-18 06:55:51

您的代码存在一些严重缺陷。

首先,在整数数组a中存在缓冲区溢出(即,可以将超过100个整数读入a中)。

正如Thomas McCarthy在你的while循环结尾创建了一个空语句的分号 - 删除它。

此外,您正在为每个角色写入sizeof(a)或100个整数到fp2。