首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言文件

C语言文件
EN

Stack Overflow用户
提问于 2015-07-27 20:54:28
回答 3查看 516关注 0票数 0

我需要关于我的代码的帮助,我有一些工作,这是一个任务。

假设使用编码/解码方案创建了一个加密文件。

每个字母根据给定的映射被其他字母替换,如下所示。

代码语言:javascript
运行
复制
char * letters = "abcdefghijklmnopqrstuvwxyz";

char * enc = "kngcadsxbvfhjtiumylzqropwe";

例如,每个a在编码文本时都会变成一个k,在解码时每个k都会变成一个a

您将编写一个程序,对文件进行编码或解码,然后使用上面的映射对文件进行编码或解码。

大写字母的映射方式与上面的小写字母相同,但仍然是大写字母。

例如,当编码一个文件时,每个'A‘变成'K’,而每个'K‘在解码时变成'A’。

数字和其他字符没有编码,并且保持不变。

编写一个程序来读取一个文件并将该文件编码为一个加密的文件。并编写一个程序来获取加密文件并解码为原始文件。您的程序应该提示用户输入一个输入文件名和一个输出文件名。

请求输入文件名/输出文件名(加密文件)。使用上述编码/解码的加密。

请求加密文件并将其解码为原始输入文件。

代码语言:javascript
运行
复制
#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“--我不知道代码中的错误是什么。

EN

回答 3

Stack Overflow用户

发布于 2015-07-27 20:59:25

您的if块应改为:

代码语言:javascript
运行
复制
if ( letters[i]==ch )
{
    ch = enlet[i];
    break;
}

这样ch就不会被两次替换。也就是说,当您知道输入文件位置的替代时,就会中断,然后继续前进。

票数 4
EN

Stack Overflow用户

发布于 2015-07-27 21:00:02

在这个循环中,在它被替换后覆盖ch。

代码语言:javascript
运行
复制
while((ch=fgetc(org))!=EOF)
{
    for(i=0;i<52;i++)
    {
        if(letters[i]==ch)
        {
            ch=enlet[i];
        }
    }           
    fputc(ch,enc);
}

你可以做两件事之一:

  1. 不要分配ch=enleti,只需执行fputch(enleti)

  1. 一旦找到匹配的,请立即中断循环。
票数 2
EN

Stack Overflow用户

发布于 2015-07-27 22:08:18

您可以跳过for()循环,只需使用:

代码语言:javascript
运行
复制
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是否为空(成功打开的文件)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31663112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档