我需要关于我的代码的帮助,我有一些工作,这是一个任务。
假设使用编码/解码方案创建了一个加密文件。
每个字母根据给定的映射被其他字母替换,如下所示。
char * letters = "abcdefghijklmnopqrstuvwxyz";
char * enc = "kngcadsxbvfhjtiumylzqropwe";例如,每个a在编码文本时都会变成一个k,在解码时每个k都会变成一个a。
您将编写一个程序,对文件进行编码或解码,然后使用上面的映射对文件进行编码或解码。
大写字母的映射方式与上面的小写字母相同,但仍然是大写字母。
例如,当编码一个文件时,每个'A‘变成'K’,而每个'K‘在解码时变成'A’。
数字和其他字符没有编码,并且保持不变。
编写一个程序来读取一个文件并将该文件编码为一个加密的文件。并编写一个程序来获取加密文件并解码为原始文件。您的程序应该提示用户输入一个输入文件名和一个输出文件名。
请求输入文件名/输出文件名(加密文件)。使用上述编码/解码的加密。
请求加密文件并将其解码为原始输入文件。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
char letters[]={"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
char enlet[]={"kngcadsxbvfhjtiumylzqropweKNGCADSXBVFHJTIUMYLZQROPWE"};
char infile[20];
char outfile[20];
char ch;
int i;
FILE *org, * enc, *dec;
printf("Enter file name (***.txt) : ");
gets(infile);
printf("Enter saving file name (***.txt) : ");
gets(outfile);
org = fopen(infile,"r");
enc = fopen(outfile,"w+");
while((ch=fgetc(org))!=EOF)
{
for(i=0;i<52;i++)
{
if(letters[i]==ch)
{
ch=enlet[i];
}
}
fputc(ch,enc);
}
fclose(org);
fclose(enc);
return 0;
}此代码工作正常,但字母更改不正确。如果我的原始文件中有"abcdefghijklmnopqrstuvwxyz“,那么在编码文件中就会发生"felcadlpbrfhjeiqmwleqropwe”。
我以为它会是"kngcadsxbvfhjtiumylzqropwe“--我不知道代码中的错误是什么。
发布于 2015-07-27 20:59:25
您的if块应改为:
if ( letters[i]==ch )
{
ch = enlet[i];
break;
}这样ch就不会被两次替换。也就是说,当您知道输入文件位置的替代时,就会中断,然后继续前进。
发布于 2015-07-27 21:00:02
在这个循环中,在它被替换后覆盖ch。
while((ch=fgetc(org))!=EOF)
{
for(i=0;i<52;i++)
{
if(letters[i]==ch)
{
ch=enlet[i];
}
}
fputc(ch,enc);
}你可以做两件事之一:
或
发布于 2015-07-27 22:08:18
您可以跳过for()循环,只需使用:
if( org && enc )
while( (ch=fgetc(org))!=EOF)
{
char *p = strchr( letters, ch );
fputc( (p)?enlet[p-letters]:ch, enc );
}此外,您还应该声明ch作为int,以便将其与EOF进行比较。gets()是等待发生并使程序崩溃的缓冲区溢出/提供一个安全漏洞钩子(使用fget(),并记住解析尾随的换行符)。您永远不会检查org和enc是否为空(成功打开的文件)。
https://stackoverflow.com/questions/31663112
复制相似问题