啊哈磊_编程从这里起步
标题:
求助
[打印本页]
作者:
javaC
时间:
2014-4-26 18:23
标题:
求助
我要程序将输入的一组数据加密
然后输出到fp.txt中
最后解密数据,输出到fp2.txt
程序两次输出都是乱码
#include<stdio.h>
main()
{
FILE *fp;
printf("passwd:");
char old[16];
scanf("%s",&old);
int num;
char new[16];
for(num=0;num<=15;num++)
{
new[num]+=old[num]+100;
}
fp=fopen("fp.txt","w");
fprintf(fp,"%s",new);
fclose(fp);
FILE *fp2;
fp2=fopen("fp2.txt","w");
char uuu[16];
for(num=0;num<=15;num++)
{
uuu[num]=new[num]-100;
}
fprintf(fp2,"%s",uuu);
fclose(fp2);
system("pause");
}
作者:
rosynirvana
时间:
2014-4-26 20:18
最要紧的问题
scanf("%s",&old);
应该是
scanf("%s", old);
复制代码
for(num=0;num<=15;num++)
num<=15就把整个数组里的东西都拷贝过去了
而且休止字符也会被后面的加密处理
应该写
for(num=0; old[num]; ++num);
复制代码
然后再补上休止字符
new[num] = '\0';
new[num]+=old[num]+100;
你没有初始化new,那么在new上面做+=很可能就是乱码
另外, +100很可能就是不可打印的字符,或者跑到字符表外面去了
为了简单,姑且写
new[num] = old+1;
复制代码
后面的同样也要改
for(num=0;old[num];num++){
uuu[num]=new[num]-1;
}
uuu[num] = '\0';
复制代码
作者:
rosynirvana
时间:
2014-4-26 20:22
还有一些不是那么紧要的问题
你定义的函数是
main()
这是C90才容许的写法
但是
scanf("%s",&old);
int num;
一条statement后有一句declaration,这是C99以及以后才允许的写法
所以这段程序不符合任何C标准
最后一个风格上的问题,你的一个变量名是new,new在C++里是关键字,用C++编译器就不能编译了
不符合所谓clean C的风格
作者:
rosynirvana
时间:
2014-4-26 20:26
本帖最后由 rosynirvana 于 2014-4-26 20:27 编辑
改好后的代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp, *fp2;
char old[16], enc[16], dec[16];
int num;
printf("passwd:");
scanf("%s",old);
for(num=0;old[num];num++)
enc[num] = old[num] + 1;
enc[num] = '\0';
fp=fopen("fp.txt","w");
fprintf(fp,"%s",enc);
fclose(fp);
fp2=fopen("fp2.txt","w");
for(num=0;old[num];num++)
dec[num] = enc[num] - 1;
dec[num] = '\0';
fprintf(fp2,"%s",dec);
fclose(fp2);
system("pause");
return 0;
}
复制代码
作者:
javaC
时间:
2014-4-27 10:50
rosynirvana 发表于 2014-4-26 20:26
改好后的代码
for(num=0;old[num];num++)
是什么意思
作者:
rosynirvana
时间:
2014-4-27 12:09
javaC 发表于 2014-4-27 10:50
for(num=0;old[num];num++)
是什么意思
for(num=0; old[num] != '\0'; num++)
事实上'\0'就是0,为了强调是一个字符,所以写成'\0'
所以只要写old[num],就可以当作终止条件了
欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/)
Powered by Discuz! X3.2