【发布时间】:2015-07-27 20:54:28
【问题描述】:
我需要关于我的代码的帮助,我有一些作品,这是其中一项任务。
假设使用编码/解码方案创建了一个加密文件。
根据给定的映射,每个字母都被其他字母替换,如下所示。
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” 我不知道我的代码有什么错误。
【问题讨论】:
-
你做了什么来尝试调试它?您是否在调试器中运行该程序?您是否将 printf 调试语句放入以尝试了解可能出现问题的地方?另外,“代码正在运行”是什么意思?如果它没有做它应该做的事情,那么它就不能说是“工作”。还是您的意思是它适用于某些输入但不适用于其他输入?
-
注意:1)
char ch;-->int ch;正确区分从EOF读取的所有字符。 2) 使用fgets()而不是gets()。 3) 查看fopen()的结果。 -
请始终缩进代码:建议在每个左大括号 '{' 后缩进 4 个空格,在每个右大括号 '} 之前不缩进。这包括每个函数开头和结尾的大括号。
-
文件名的长度可以超过 19 个字符。 'gets()' 将允许用户溢出输入缓冲区,导致未定义的行为,并且可能/将导致段错误事件。 'chux' 建议使用 fgets() 来输入文件名。这仍然会将文件名限制为 19 个字符,但会避免缓冲区溢出问题。建议使用 'readline()' 然后修剪尾随的换行符序列以获取文件名。注意:如果使用 fgets(),您还必须修剪“换行符”字符序列
-
当为输出文件调用 fopen() 时,只需使用“w”作为模式参数,因为该程序不会同时从输出文件中读取。