鱼C论坛

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

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

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

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

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

x
用的是Visual Studio 2022

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

微信截图_20221203230557.jpg

这些报错,群里大神帮忙看看 感谢!
/*安全课程加密程序V1.0
 *作者:CuiSY
 */

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

#include <ctype.h>

/*声明一些变量*/
char ch = "0";
char filename[256] = "";//保存输入的数据---文件路径
FILE* fp = NULL;
FILE* fptemp = NULL;
char password[12] = "123456";
const char tempfile[256] = "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[i++];
                /*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;


}
最佳答案
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 行,去掉行末的分号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 行,去掉行末的分号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[256] = "";//保存输入的数据---文件路径
FILE* fp = NULL;
FILE* fptemp = NULL;
char password[12] = "123456";
const char tempfile[256] = "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[i++];
                /*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;


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

使用道具 举报

 楼主| 发表于 2022-12-5 21:36:26 | 显示全部楼层
/*安全课程加密程序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[256] = "";//保存输入的数据---文件路径
FILE* fp = NULL;
FILE* fptemp = NULL;
char password[12] = "123456";
const char tempfile[256] = "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[i++];
                /*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个地方修改过之后,又有其他报错了。。 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行)
                ch*=password[i++] ; 
        自翻转的算法可不是这么写的,得改为:
                ch ^= password[i ++] ; 
        用新编译的程序加密 + 解密才会有自翻转的效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 10:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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