2013-07-28 131 views
-4

我想编程一个encrptor和解密程序。我的问题是我首先赋值的指针仍然与第二个值相同。我试图使用免费的,但问题仍然是一样的。 例如,我输入aslkdjlasc(样品只) 和输出将是: 的HelloWorld指针解引用,坏指针

我尝试再次运行该程序,然后I型daskjda 输出将会像 doctorxRLD

RLD是来自这个指针的过去值。它应该只有7个字符,但由于helloworld是10,所以前7个字母被加密代替,但最后3个字符仍然被打印。

我该怎么办?

更新:这里是部分代码:

void encrypt(char *crypt) 
{ 
char *plaintext,*encryption,slash=0x2F; 
int i,j,k,flags,f; 
encryption=(char *)malloc(sizeof(int)); 
plaintext=(char *)malloc(sizeof(int)); 
printf("Enter plaintext, spaces,commas,and dots should be represented as /:\n"); 
scanf("%s",&*plaintext); 
for(i=0;i<strlen(plaintext);i++) 
{ 
    j=1;flags=0; 
    while(j<53 && flags==0) 
    { 
     if(plaintext[i]==slash) 
     { 
      encryption[i]=slash; 
      flags=1; 
     } 
     if(plaintext[i]==crypt[j]) 
     { 
      encryption[i]=crypt[j-1]; 
      flags=1; 
     } 
     k=j+2; 
     j=k; 
    } 
} 
printf("%s",encryption); 
    free(encryption); 
    free(plaintext); 
getch(); 
} 

这里是主要的

main() 
{ 
char c; 
int timer; 
char crypt[53]="***i have hidden my encryption code***"; 
clrscr(); 
printf("Press e to encrypt, d to decrypt, ESC to exit.\n"); 
c=getch(); 
switch(c) 
{ 
    case(0x1b): 
     exit(0); 
     break; 
    case(0x64): 
     decrypt(crypt); 
     break; 
    case(0x65): 
     encrypt(crypt); 
     break; 
    default: 
     printf("INVALID. FORCE EXIT IN 3 SEC0NDS."); 
     delay(3000); 
     exit(0); 
} 

getch(); 
} 
+1

'free()'不会将指针设置为NULL,请在此处添加您的代码 –

+2

我们无法告诉您如何修复我们看不到的代码。你做错了什么,但是如果没有相应的代码,就不可能说出什么。 – Mat

+0

这似乎是你缺少一个字符串终止符。请张贴一些相关的代码,否则这将很难回答。 –

回答

1

在你的代码是一个字符串分配的内存整型大小(4个字节)

当您做

plaintext=(char *)malloc(sizeof(int)); 

然后做这个

scanf("%s",&*plaintext); 

你的可能扫描尺寸的字符串超过四个字符(但是你只分配了四个字节)也

scanf("%s",&*plaintext);相当于scanf("%s",plaintext);(与前面的说法你正在增加不必要的计算。

+1

实际上,通过分配int的大小,字符串中只有* three *个字符的空间,因为必须为字符串终止符保存一个字符。 –

+0

@JoachimPileborg正好;) –

0

这是我。我已经知道了。感谢你的所有评论,尽管有些是苛刻的。哈哈

  1. 我没有使用malloc,因为显然DCoder指出我不知道如何使用它们。
  2. 谢谢Sanyam Goel我也修复了我的scanf。
  3. 我只用了2个指针而不是4.我做的是我在主函数中实例化了它们,而不是在每个decrpyt和encrypt函数中。就像这样:

    main() { char c,*from, *to; ..........

    void encrypt(char *crypt,char *plaintext,char *encryption)

    void encrypt(char *crypt,char *ciphertext,char *decryption)

所以,当我把其中任何,我只是把:

case(0x64): 
     decrypt(crypt,from,to); 
     break; 
    case(0x65): 
     encrypt(crypt,from,to); 
     break; 

而在的结束开关主要功能:

free(from); from=NULL; 
    free(to); to=NULL; 

所以现在我已经消除了不必要的指针和额外的进程。

谢谢大家。 :)