【问题标题】:File in c languagec语言文件
【发布时间】: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”作为模式参数,因为该程序不会同时从输出文件中读取。

标签: c file fgetc


【解决方案1】:

你的 if 块应该是:

if ( letters[i]==ch )
{
    ch = enlet[i];
    break;
}

这样ch 就不会被替换两次。即,当您知道该输入文件位置的替换时,中断并继续。

【讨论】:

  • 对!!非常感谢
【解决方案2】:

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

while((ch=fgetc(org))!=EOF)
{
    for(i=0;i<52;i++)
    {
        if(letters[i]==ch)
        {
            ch=enlet[i];
        }
    }           
    fputc(ch,enc);
}

你可以做以下两件事之一:

  1. 不要分配 ch=enlet[i],只需执行 fputch(enlet[i])

  1. 找到匹配项后立即中断循环

【讨论】:

    【解决方案3】:

    你可以跳过 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() 是等待发生的缓冲区溢出并导致程序崩溃/提供安全漏洞利用钩子(使用fgets() 并记住解析掉尾随的换行符)。而且你永远不会检查 org 和 enc 是否不为 NULL(文件打开成功)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多