鱼C论坛

 找回密码
 立即注册
查看: 2050|回复: 9

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

[复制链接]
发表于 2022-12-3 23:07:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用的是Visual Studio 2022

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

微信截图_20221203230557.jpg

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

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

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

  10. #include <ctype.h>

  11. /*声明一些变量*/
  12. char ch = "0";
  13. char filename[256] = "";//保存输入的数据---文件路径
  14. FILE* fp = NULL;
  15. FILE* fptemp = NULL;
  16. char password[12] = "123456";
  17. const char tempfile[256] = "temp1234567890.temp";
  18. int pwdlen = 0;
  19. int i = 0


  20. /*封装一些函数*/



  21. /*函数声明*/;
  22. void menu();
  23. void inputpass(char* pass);

  24. /*函数实现*/;

  25. void inputpass(char* pass);
  26. {
  27.         scanf("%s", pass);
  28. }
  29.        
  30.        
  31. void menu()

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

  47.         }
  48.         /*如果文件存在*/

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

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

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




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

  60.         while (1)
  61.         {
  62.                 ch = getc(fp);
  63.                 if (feof(fp))
  64.                 {
  65.                         /*判断文件读取完没*/
  66.                         break;

  67.                 }
  68.                 /*每取出一个字符就加密*/
  69.                 ch*=password[i++];
  70.                 /*ch里就是加密以后的数据了*/
  71.                 fputc(ch,fptemp);
  72.                 //判断
  73.                 if (i == pwdlen)
  74.                 {
  75.                         i = 0;
  76.                 }
  77.         }

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

  84. }


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

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

  88.         /*函数调用*/;
  89.         menu();
  90.         return 0;


  91. }
复制代码
最佳答案
2022-12-4 00:19:44
本帖最后由 jackz007 于 2022-12-4 00:21 编辑
  1. #define _CRT_SECURE_NO_WARNINGS  // 添加此行作为代码文件第一行
  2. . . . . . .
  3. char ch = '0' ;                  // 15 行,定义字符不可以使用双引号
  4. . . . . . .
  5. void inputpass(char* pass)       // 35 行,去掉行末的分号
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-4 00:19:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-12-4 00:21 编辑
  1. #define _CRT_SECURE_NO_WARNINGS  // 添加此行作为代码文件第一行
  2. . . . . . .
  3. char ch = '0' ;                  // 15 行,定义字符不可以使用双引号
  4. . . . . . .
  5. void inputpass(char* pass)       // 35 行,去掉行末的分号
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-4 10:59:50 | 显示全部楼层
  1. /*安全课程加密程序V1.0
  2. *作者:CuiSY
  3. */

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

  10. #include <ctype.h>

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


  20. /*封装一些函数*/



  21. /*函数声明*/;
  22. void menu();
  23. void inputpass(char* pass);

  24. /*函数实现*/;

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

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

  47.         }
  48.         /*如果文件存在*/

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

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

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




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

  60.         while (1)
  61.         {
  62.                 ch = getc(fp);
  63.                 if (feof(fp))
  64.                 {
  65.                         /*判断文件读取完没*/
  66.                         break;

  67.                 }
  68.                 /*每取出一个字符就加密*/
  69.                 ch*=password[i++];
  70.                 /*ch里就是加密以后的数据了*/
  71.                 fputc(ch,fptemp);
  72.                 //判断
  73.                 if (i == pwdlen)
  74.                 {
  75.                         i = 0;
  76.                 }
  77.         }

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

  84. }


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

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

  88.         /*函数调用*/;
  89.         menu();
  90.         return 0;


  91. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-5 21:36:26 | 显示全部楼层
  1. /*安全课程加密程序V1.0
  2. *作者:CuiSY
  3. */

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

  10. #include <ctype.h>

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

  12. /*声明一些变量*/
  13. char ch = '0';
  14. char filename[256] = "";//保存输入的数据---文件路径
  15. FILE* fp = NULL;
  16. FILE* fptemp = NULL;
  17. char password[12] = "123456";
  18. const char tempfile[256] = "temp1234567890.temp";
  19. int pwdlen = 0;
  20. int i = 0


  21. /*封装一些函数*/



  22. /*函数声明*/;
  23. void menu();
  24. void inputpass(char* pass);

  25. /*函数实现*/;

  26. void inputpass(char* pass)
  27. {
  28.         scanf("%s",pass);
  29.        
  30. }
  31.        
  32.        
  33. void menu()

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

  49.         }
  50.         /*如果文件存在*/

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

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

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




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

  62.         while (1)
  63.         {
  64.                 ch = getc(fp);
  65.                 if (feof(fp))
  66.                 {
  67.                         /*判断文件读取完没*/
  68.                         break;

  69.                 }
  70.                 /*每取出一个字符就加密*/
  71.                 ch*=password[i++];
  72.                 /*ch里就是加密以后的数据了*/
  73.                 fputc(ch,fptemp);
  74.                 //判断
  75.                 if (i == pwdlen)
  76.                 {
  77.                         i = 0;
  78.                 }
  79.         }

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

  86. }


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

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

  90.         /*函数调用*/;
  91.         menu();
  92.         return 0;


  93. }
复制代码



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


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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-5 21:40:30 | 显示全部楼层

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


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

报错  
4.jpg

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

麻烦在帮忙看看  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-5 21:49:39 From FishC Mobile | 显示全部楼层
xiangyuebj 发表于 2022-12-5 21:40
你好,,我查看了 我用的VS2022 不能用gets这个函数,得用gets_s



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

那个gets那件事我觉得你可以用用fgets
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-5 22:06:20 | 显示全部楼层
xiangyuebj 发表于 2022-12-5 21:36
按照你提示的3个地方修改过之后,又有其他报错了。。

        知不知道,什么叫第一行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-5 23:07:25 | 显示全部楼层
jackz007 发表于 2022-12-5 22:06
知不知道,什么叫第一行?

444.jpg


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

但是 执行的过程中出现问题,,
正常情况下应该是第一次是加密,第二次是解密,,但是 现在执行完之后 貌似是解密不了。。
帮忙再看看 感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

感谢大佬。。。解决啦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-5 23:37:13 | 显示全部楼层
本帖最后由 jackz007 于 2022-12-5 23:39 编辑
xiangyuebj 发表于 2022-12-5 23:07
你好,,代码可以正常编辑执行了。。

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


        这一句(第90行)
  1.                 ch*=password[i++] ;
复制代码

        自翻转的算法可不是这么写的,得改为:
  1.                 ch ^= password[i ++] ;
复制代码

        用新编译的程序加密 + 解密才会有自翻转的效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 03:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表