加密一个简单的数组
问题描述:
对于我必须做的实验,我需要创建一个程序,它将从文本文件中获取一个简单的字符串,并使用一个键进行加密 - 一个介于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;
}
答
您的代码存在一些严重缺陷。
首先,在整数数组a中存在缓冲区溢出(即,可以将超过100个整数读入a中)。
正如Thomas McCarthy在你的while循环结尾创建了一个空语句的分号 - 删除它。
此外,您正在为每个角色写入sizeof(a)或100个整数到fp2。
啊,我把它改成'while(!feof(fp1));',但这仍然没有任何帮助。 – 2012-03-18 06:53:19
另外,在该行末尾的额外分号并没有帮助... – 2012-03-18 06:54:46
@ ThomasPadron-McCarthy:好! – 2012-03-18 06:55:51