看教程,用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:21 编辑
#define _CRT_SECURE_NO_WARNINGS// 添加此行作为代码文件第一行
. . . . . .
char ch = '0' ; // 15 行,定义字符不可以使用双引号
. . . . . .
void inputpass(char* pass) // 35 行,去掉行末的分号 /*安全课程加密程序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;
} 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个地方修改过之后,又有其他报错了。。
帮忙看看 是什么问题,,,
zhangjinxuan 发表于 2022-12-4 10:59
你好,,我查看了 我用的VS2022 不能用gets这个函数,得用gets_s
其他代码 我全部复制 过去之后
报错
你的代码 我就吧gets改成gets_s 其他都是一样的,,出现如图报错。。
麻烦在帮忙看看 xiangyuebj 发表于 2022-12-5 21:40
你好,,我查看了 我用的VS2022 不能用gets这个函数,得用gets_s
大意好像就是说这个函数不安全,我也不太懂VS,或者你把标准改成C99吧
那个gets那件事我觉得你可以用用fgets xiangyuebj 发表于 2022-12-5 21:36
按照你提示的3个地方修改过之后,又有其他报错了。。
知不知道,什么叫第一行? jackz007 发表于 2022-12-5 22:06
知不知道,什么叫第一行?
你好,,代码可以正常编辑执行了。。
但是 执行的过程中出现问题,,
正常情况下应该是第一次是加密,第二次是解密,,但是 现在执行完之后 貌似是解密不了。。
帮忙再看看 感谢 zhangjinxuan 发表于 2022-12-5 21:49
大意好像就是说这个函数不安全,我也不太懂VS,或者你把标准改成C99吧
那个gets那件事我觉得你可以用 ...
感谢大佬。。。解决啦。 本帖最后由 jackz007 于 2022-12-5 23:39 编辑
xiangyuebj 发表于 2022-12-5 23:07
你好,,代码可以正常编辑执行了。。
但是 执行的过程中出现问题,,
这一句(第90行)
ch*=password ;
自翻转的算法可不是这么写的,得改为:
ch ^= password ;
用新编译的程序加密 + 解密才会有自翻转的效果。
页:
[1]