我需要有关我的代码的帮助,我得到了一些作品,这是作业之一。
假设使用编码/解码方案创建了加密文件。
根据给定的映射,每个字母被其他字母替换,如下所示。
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” 我不知道我的代码中有什么错误。
答案 0 :(得分:4)
您的if块应为:
if ( letters[i]==ch )
{
ch = enlet[i];
break;
}
这样ch
不会被替换两次。即,您知道替换该输入文件位置,中断并继续前进的那一刻。
答案 1 :(得分:2)
在此循环中,您在替换ch之后覆盖ch。
while((ch=fgetc(org))!=EOF)
{
for(i=0;i<52;i++)
{
if(letters[i]==ch)
{
ch=enlet[i];
}
}
fputc(ch,enc);
}
你可以做以下两件事之一:
或
答案 2 :(得分:0)
您可以跳过for()循环并使用:
\includegraphics[width=0.7\textwidth]{picturesToInc/IMG_7254}
另外,你真的应该将ch声明为int以将其与EOF进行比较。并且gets()是等待发生的缓冲区溢出并使程序崩溃/提供安全漏洞钩子(使用fgets()并记住解析尾随的换行符)。你永远不会检查org和enc是否为NULL(文件打开成功)