2013-07-28 5 views
-4

encrptor 및 decryptor를 프로그래밍하려고합니다. 내 문제는 내가 먼저 값을 할당 포인터는 여전히 두 번째와 같은 값을 가지고있다. 나는 자유롭게 사용하려고 노력했지만 문제는 여전히 동일하다. 예를 들어 , 나는 aslkdjlasc를 입력 (샘플 만) 출력은 다음과 같습니다 helloworld를역 참조 해제, 불량 포인터

내가 RLD가

doctorxRLD

같이 출력 될 것이다 그럼 내가 daskjda 입력 프로그램을 다시 실행하려고 이 포인터의 과거 값으로부터. 그것은 7 문자로만되어 있지만 helloworld가 10이기 때문에 처음 7 글자는 암호화로 대체되지만 마지막 3 글자는 여전히 인쇄됩니다.

어떻게해야합니까?

UPDATE : 여기에 코드의 일부입니다 : 여기

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(); 
} 

이 코드는 문자열을 메모리의 정수 크기 (4 바이트)를 할당하는 주요

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

IS는

할 때

plaintext=(char *)malloc(sizeof(int)); 
다음이

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

를 수행하여 가능성이 더 있습니다 (하지만 당신은 단지 4 바이트를 할당)이 네 문자

scanf("%s",&*plaintext);보다 크기의 문자열을 스캔하면 이전 문 (scanf("%s",plaintext);에 해당

당신 불필요한 계산을 추가하고 있습니다.

+1

실제로'int '의 크기를 할당함으로써 문자열에 * 3 * 문자를위한 공간 만 있습니다. 문자열 종료자를 위해 저장해야하기 때문입니다. –

+0

@JoachimPileborg 예;) –

0

나에요. 나는 이미 그것을 얻었다. 일부는 가혹한 의견을 보내 주셔서 감사합니다. 하하

  1. DCoder가 지적했기 때문에 malloc 사용을 자제 했으므로 사용 방법을 모르겠습니다.
  2. 감사합니다. Sanyam Goel 내 scanf도 수정했습니다.
  3. 4 대신 2 포인터 만 사용했습니다. 내가 한 것은 decrpyt 및 encrypt 함수 대신에 주 함수에서 인스턴스화 한 것입니다.이처럼 :

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

    을 그리고의 말 : 내가 그들 중 하나를 호출 할 때

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

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

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

을 그래서, 난 그냥 넣어 주 기능의 스위치 :

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

이제 불필요한 포인터와 추가 프로세스가 제거되었습니다.

감사합니다. :)