2013-07-28 197 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; 

所以現在我已經消除了不必要的指針和額外的進程。

謝謝大家。 :)