啊哈磊_编程从这里起步

标题: 求助 [打印本页]

作者: 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);
应该是
  1. scanf("%s", old);
复制代码


for(num=0;num<=15;num++)
num<=15就把整个数组里的东西都拷贝过去了
而且休止字符也会被后面的加密处理
应该写
  1. for(num=0; old[num]; ++num);
复制代码

然后再补上休止字符
new[num] = '\0';

new[num]+=old[num]+100;
你没有初始化new,那么在new上面做+=很可能就是乱码
另外, +100很可能就是不可打印的字符,或者跑到字符表外面去了
为了简单,姑且写
  1. new[num] = old+1;
复制代码


后面的同样也要改
  1. for(num=0;old[num];num++){
  2.     uuu[num]=new[num]-1;
  3.   }
  4. 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 编辑

改好后的代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.   FILE *fp, *fp2;
  6.   char old[16], enc[16], dec[16];
  7.   int num;

  8.   printf("passwd:");
  9.   scanf("%s",old);

  10.   for(num=0;old[num];num++)
  11.     enc[num] = old[num] + 1;
  12.   enc[num] = '\0';
  13.   
  14.   fp=fopen("fp.txt","w");
  15.   fprintf(fp,"%s",enc);
  16.   fclose(fp);

  17.   fp2=fopen("fp2.txt","w");
  18.   for(num=0;old[num];num++)
  19.     dec[num] = enc[num] - 1;
  20.   dec[num] = '\0';
  21.   fprintf(fp2,"%s",dec);
  22.   fclose(fp2);

  23.   system("pause");
  24.   return 0;
  25. }
复制代码

作者: 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