2013-07-28 3 views
-4

Я пытаюсь запрограммировать encrptor и decryptor. Моя проблема - это указатель, который я присвоил значение во-первых, все еще имеет то же значение, что и второе. Я пытался использовать бесплатно, но проблема все та же. Например, я напечатал aslkdjlasc (образец только) и результат будет: HelloWorldУказатели разыменования, неправильные указатели

Я пытаюсь запустить программу еще раз, то я типа daskjda результат будет как doctorxRLD

RLD является из прошлого значения этого указателя. Предполагается, что это только 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(); 
} 

ЗДЕСЬ ГЛАВНЫЙ

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', в строке есть только место для * трех * символов, так как нужно сохранить для терминатора строк. –

+0

@JoachimPileborg Да точно;) –

0

это я. Я уже поняла. Спасибо всем вашим комментариям, хотя некоторые из них суровы. haha

  1. Я воздержался от использования malloc, потому что, по-видимому, DCoder указывает, что я не знаю, как их использовать.
  2. Спасибо Sanyam Goel Я тоже исправил свой скан.
  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; 

Так что теперь я устранил ненужные указатели и дополнительные процессы.

СПАСИБО ВАС ВСЕ. :)

Смежные вопросы