xiangyuebj 发表于 2022-12-3 23:07:38

看教程,用C编写一个加密解密程序碰到的问题!

用的是Visual Studio 2022

对着教程里敲得代码,但是编译运行时报错,也百度查了,但是 没找到 究竟是啥问题。



这些报错,群里大神帮忙看看 感谢!

/*安全课程加密程序V1.0
*作者:CuiSY
*/

//导入头文件        标准输入输出
#include <stdio.h>
//字符串 提供一些字符串所用的函数
#include <string.h>
//系统函数
#include <stdlib.h>

#include <ctype.h>

/*声明一些变量*/
char ch = "0";
char filename = "";//保存输入的数据---文件路径
FILE* fp = NULL;
FILE* fptemp = NULL;
char password = "123456";
const char tempfile = "temp1234567890.temp";
int pwdlen = 0;
int i = 0


/*封装一些函数*/



/*函数声明*/;
void menu();
void inputpass(char* pass);

/*函数实现*/;

void inputpass(char* pass);
{
        scanf("%s", pass);
}
       
       
void menu()

{
        printf("****************************************");
        printf("*************安全课程小程序*************");
        printf("****************************************");
        printf("**请输入要加密或解密的文件路径**\n");
        printf("**例如:/user/CuiSY/av.txt**\n");
        /*步骤一:打开一个文件或目录*/
        /*通过字符终端读取一个字符串*/
        gets_s(filename);
        if (NULL == (fp = fopen(filename, "rb")))
        {
                /*如果不为空,表示文件存在,空的表示文件存在*/
                printf("您好!您所输入的文件不存在\n");
                /*退出*/
                exit(1);

        }
        /*如果文件存在*/

        printf("文件已打开,请输入密码:888888");

        inputpass(password);
        pwdlen = (int)strlen(password);
        if (0 == pwdlen)
        {
                printf("对不起,密码长度不能为0.\n");
                exit(2);
        }

        /*步骤二:读出文件内容加密*/
        fptemp = fopen(tempfile, "wb");




        /*步骤三:把加密的信息写入文件覆盖原来的数据*/

        while (1)
        {
                ch = getc(fp);
                if (feof(fp))
                {
                        /*判断文件读取完没*/
                        break;

                }
                /*每取出一个字符就加密*/
                ch*=password;
                /*ch里就是加密以后的数据了*/
                fputc(ch,fptemp);
                //判断
                if (i == pwdlen)
                {
                        i = 0;
                }
        }

        //循环结束后 清理
        fclose(fp);
        fclose(fptemp);
        remove(filename);
        rename(tempfile, filename);
        printf("恭喜你,加密/解密成功!");

}


//主函数 是C语言程序的入口地址

int main(int argc, char const* argv[])
{

        /*函数调用*/;
        menu();
        return 0;


}

jackz007 发表于 2022-12-4 00:19:44

本帖最后由 jackz007 于 2022-12-4 00:21 编辑

#define _CRT_SECURE_NO_WARNINGS// 添加此行作为代码文件第一行
. . . . . .
char ch = '0' ;                  // 15 行,定义字符不可以使用双引号
. . . . . .
void inputpass(char* pass)       // 35 行,去掉行末的分号

zhangjinxuan 发表于 2022-12-4 10:59:50

/*安全课程加密程序V1.0
*作者:CuiSY
*/

//导入头文件      标准输入输出
#include <stdio.h>
//字符串 提供一些字符串所用的函数
#include <string.h>
//系统函数
#include <stdlib.h>

#include <ctype.h>

/*声明一些变量*/
char ch = '0';/*PS1:char类型应该用单引号*/
char filename = "";//保存输入的数据---文件路径
FILE* fp = NULL;
FILE* fptemp = NULL;
char password = "123456";
const char tempfile = "temp1234567890.temp";
int pwdlen = 0;
int i = 0


/*封装一些函数*/



/*函数声明*/;
void menu();
void inputpass(char* pass);

/*函数实现*/;

void inputpass(char* pass) /*PS2:加分号就是声明函数啦,应该说加了分号这一行就和下面的代码是互不相关的了*/
{
      scanf("%s", pass);
}
      
      
void menu()

{
      printf("****************************************");
      printf("*************安全课程小程序*************");
      printf("****************************************");
      printf("**请输入要加密或解密的文件路径**\n");
      printf("**例如:/user/CuiSY/av.txt**\n");
      /*步骤一:打开一个文件或目录*/
      /*通过字符终端读取一个字符串*/
      gets(filename); /*PS3:这里应该用gets,大不了用fgets吧*/
      if (NULL == (fp = fopen(filename, "rb")))
      {
                /*如果不为空,表示文件存在,空的表示文件存在*/
                printf("您好!您所输入的文件不存在\n");
                /*退出*/
                exit(1);

      }
      /*如果文件存在*/

      printf("文件已打开,请输入密码:888888");

      inputpass(password);
      pwdlen = (int)strlen(password);
      if (0 == pwdlen)
      {
                printf("对不起,密码长度不能为0.\n");
                exit(2);
      }

      /*步骤二:读出文件内容加密*/
      fptemp = fopen(tempfile, "wb");




      /*步骤三:把加密的信息写入文件覆盖原来的数据*/

      while (1)
      {
                ch = getc(fp);
                if (feof(fp))
                {
                        /*判断文件读取完没*/
                        break;

                }
                /*每取出一个字符就加密*/
                ch*=password;
                /*ch里就是加密以后的数据了*/
                fputc(ch,fptemp);
                //判断
                if (i == pwdlen)
                {
                        i = 0;
                }
      }

      //循环结束后 清理
      fclose(fp);
      fclose(fptemp);
      remove(filename);
      rename(tempfile, filename);
      printf("恭喜你,加密/解密成功!");

}


//主函数 是C语言程序的入口地址

int main(int argc, char const* argv[])
{

      /*函数调用*/;
      menu();
      return 0;


}

xiangyuebj 发表于 2022-12-5 21:36:26

jackz007 发表于 2022-12-4 00:19


/*安全课程加密程序V1.0
*作者:CuiSY
*/

//导入头文件        标准输入输出
#include <stdio.h>
//字符串 提供一些字符串所用的函数
#include <string.h>
//系统函数
#include <stdlib.h>

#include <ctype.h>

#define _CRT_SECURE_NO_WARNINGS// 添加此行作为代码文件第一行

/*声明一些变量*/
char ch = '0';
char filename = "";//保存输入的数据---文件路径
FILE* fp = NULL;
FILE* fptemp = NULL;
char password = "123456";
const char tempfile = "temp1234567890.temp";
int pwdlen = 0;
int i = 0


/*封装一些函数*/



/*函数声明*/;
void menu();
void inputpass(char* pass);

/*函数实现*/;

void inputpass(char* pass)
{
        scanf("%s",pass);
       
}
       
       
void menu()

{
        printf("****************************************");
        printf("*************安全课程小程序*************");
        printf("****************************************");
        printf("**请输入要加密或解密的文件路径**\n");
        printf("**例如:/user/CuiSY/av.txt**\n");
        /*步骤一:打开一个文件或目录*/
        /*通过字符终端读取一个字符串*/
        gets_s(filename);
        if (NULL == (fp = fopen(filename, "rb")))
        {
                /*如果不为空,表示文件存在,空的表示文件存在*/
                printf("您好!您所输入的文件不存在\n");
                /*退出*/
                exit(1);

        }
        /*如果文件存在*/

        printf("文件已打开,请输入密码:888888");

        inputpass(password);
        pwdlen = (int)strlen(password);
        if (0 == pwdlen)
        {
                printf("对不起,密码长度不能为0.\n");
                exit(2);
        }

        /*步骤二:读出文件内容加密*/
        fptemp = fopen(tempfile, "wb");




        /*步骤三:把加密的信息写入文件覆盖原来的数据*/

        while (1)
        {
                ch = getc(fp);
                if (feof(fp))
                {
                        /*判断文件读取完没*/
                        break;

                }
                /*每取出一个字符就加密*/
                ch*=password;
                /*ch里就是加密以后的数据了*/
                fputc(ch,fptemp);
                //判断
                if (i == pwdlen)
                {
                        i = 0;
                }
        }

        //循环结束后 清理
        fclose(fp);
        fclose(fptemp);
        remove(filename);
        rename(tempfile,filename);
        printf("恭喜你,加密/解密成功!");

}


//主函数 是C语言程序的入口地址

int main(int argc, char const* argv[])
{

        /*函数调用*/;
        menu();
        return 0;


}


按照你提示的3个地方修改过之后,又有其他报错了。。


帮忙看看 是什么问题,,,


xiangyuebj 发表于 2022-12-5 21:40:30

zhangjinxuan 发表于 2022-12-4 10:59



你好,,我查看了 我用的VS2022 不能用gets这个函数,得用gets_s


其他代码 我全部复制 过去之后

报错


你的代码 我就吧gets改成gets_s 其他都是一样的,,出现如图报错。。

麻烦在帮忙看看

zhangjinxuan 发表于 2022-12-5 21:49:39

xiangyuebj 发表于 2022-12-5 21:40
你好,,我查看了 我用的VS2022 不能用gets这个函数,得用gets_s




大意好像就是说这个函数不安全,我也不太懂VS,或者你把标准改成C99吧

那个gets那件事我觉得你可以用用fgets

jackz007 发表于 2022-12-5 22:06:20

xiangyuebj 发表于 2022-12-5 21:36
按照你提示的3个地方修改过之后,又有其他报错了。。




      知不知道,什么叫第一行?

xiangyuebj 发表于 2022-12-5 23:07:25

jackz007 发表于 2022-12-5 22:06
知不知道,什么叫第一行?




你好,,代码可以正常编辑执行了。。

但是 执行的过程中出现问题,,
正常情况下应该是第一次是加密,第二次是解密,,但是 现在执行完之后 貌似是解密不了。。
帮忙再看看 感谢

xiangyuebj 发表于 2022-12-5 23:09:57

zhangjinxuan 发表于 2022-12-5 21:49
大意好像就是说这个函数不安全,我也不太懂VS,或者你把标准改成C99吧

那个gets那件事我觉得你可以用 ...

感谢大佬。。。解决啦。

jackz007 发表于 2022-12-5 23:37:13

本帖最后由 jackz007 于 2022-12-5 23:39 编辑

xiangyuebj 发表于 2022-12-5 23:07
你好,,代码可以正常编辑执行了。。

但是 执行的过程中出现问题,,


      这一句(第90行)
                ch*=password ;
      自翻转的算法可不是这么写的,得改为:
                ch ^= password ;
      用新编译的程序加密 + 解密才会有自翻转的效果。
页: [1]
查看完整版本: 看教程,用C编写一个加密解密程序碰到的问题!