<C> Zabezpiecznie błędów, program szyfujący/deszyfrujący

0

Witam,

mam pewne problemy z zabezpieczeniem błędów programu szyfrującego i deszyfrując, szyfr jest prosty i mono-alfabetyczny(a=11,b=12,c=13,d=14,e=15,f=21 itd.), nie o niego tutaj chodzi, chciałem jeszcze dodać, że wydaje mi się, że nie powinienem deklarować struktur globalnie, bo przez to mam dwie funkcje wypisz, no ale tak już napisałem i już nie będę tego zmieniał, chyba, że przez to są te błędy o które mi chodzi.

-uruchamiam program, za pierwszym razem chcę coś zaszyfrować następnie chcę coś odszyfrować i od razu błąd

-chcę coś odszyfrować(wciskam 1), wprowadzam inny znak niż litera i nagle błąd, jeśli dalej, nie na pierwszym miejscu wpiszę jakiś znak różny od litery to ten fragment kodu, spełnia swoje zadanie i taki znak odrzuca:

 if( literaSzyfrowana >='a' && literaSzyfrowana <='z' || literaSzyfrowana >= 'A' && literaSzyfrowana <= 'Z')
     		{
		 		 literaZaszyfrowana=tablicaPolibiuszSzyfrowanie(literaSzyfrowana);
   			}
   			else if(literaSzyfrowana=='\n')
   				break;
   			else
   				continue; 

Zdaje sobie sprawę, że przekopywanie się przez ten kod to nic przyjemnego, ale od czegoś trzeba zacząć, więc proszę o pomoc :)

cały kod:

#include<stdio.h>
#include<stdlib.h>

int tablicaPolibiuszSzyfrowanie(char litera);
char tablicaPolibiuszDeszyfrowanie(int litera);
int dodajLitere(int litera);
int dodajOdkodowane(char a);
void wypisz();
void wypisz2();
void gwiazdki();

struct zakodowane
{
	struct zakodowane *next;
	int wartosci;
};

struct odkodowane
{
	struct odkodowane *next;
    char litery ;
};

struct zakodowane *kolejneLitery;
struct odkodowane *odkodwaneLitery;



int main()
{
	//do szyfrowania
	char literaSzyfrowana;
	int literaZaszyfrowana;
	//do deszyfrowania
	int literaDoOdszyfrowania;
	char literaOdszyfrowana;


	int i=0;
	int wybor=0;

while(1)
{
	gwiazdki();
	printf("\t\tPROGRAM SZYFRUJACY I DESZYFRUJACY METODA POLIBIUSZA\n");
   	gwiazdki();

	printf("Co chcesz zrobic?\n");
	printf("1.Szyfrowanie tekstu\n");
   	printf("2.Deszyfrowanie tekstu\n");
   	printf("3.Zakoncz\n");

   	scanf("%d", &wybor);
   	getchar();

   if(wybor==1)
   {
   	 gwiazdki();
     printf("TEKST:\n");
   	while(1)
      {
        scanf("%c",&literaSzyfrowana);


		 if( literaSzyfrowana >='a' && literaSzyfrowana <='z' || literaSzyfrowana >= 'A' && literaSzyfrowana <= 'Z')
     		{
		 		 literaZaszyfrowana=tablicaPolibiuszSzyfrowanie(literaSzyfrowana);
   			}
   			else if(literaSzyfrowana=='\n')
   				break;
   			else
   				continue;

	   		if(i==0)

   			{
   				kolejneLitery=(struct zakodowane*)malloc(sizeof(struct zakodowane));
        		kolejneLitery->wartosci=literaZaszyfrowana;
   				kolejneLitery->next=NULL;
   			}
   			else
            {
   			dodajLitere(literaZaszyfrowana);

            }
   			i++;
	   }
	   printf("ZASZYFROWANY:\n");
	   wypisz();

	   printf("\n");
	   gwiazdki();
	}

	else if(wybor==2)
	{
	    gwiazdki();
        printf("ZDANIE DO ODSZYFROWANIA(aby przerwac wcisnij ZERO):\n");
 	   while(1)
 	    {

		scanf("%d",&literaDoOdszyfrowania);

	 if( literaDoOdszyfrowania >= 11 && literaDoOdszyfrowania <= 15 || literaDoOdszyfrowania >= 21 && literaDoOdszyfrowania <= 25 || literaDoOdszyfrowania >= 31 && literaDoOdszyfrowania <= 35 || literaDoOdszyfrowania >= 41 && literaDoOdszyfrowania <= 45 || literaDoOdszyfrowania >= 51 && literaDoOdszyfrowania <= 55  )
       {
	   	literaOdszyfrowana=tablicaPolibiuszDeszyfrowanie(literaDoOdszyfrowania);

	   }
    else if (literaDoOdszyfrowania == 0 )
      {

       break;
      }
    else
       continue;

       if(i==0)
       {
           		odkodwaneLitery=(struct odkodowane*)malloc(sizeof(struct odkodowane));
        		odkodwaneLitery->litery=literaOdszyfrowana;
   				odkodwaneLitery->next=NULL;

       }
       else
       {

           dodajOdkodowane(literaOdszyfrowana);

       }

        i++;
 	    }

        wypisz2();

    }
    else if( wybor==3 )
       {
        break;
       }
    else
        continue;
}

return 0;
}




int tablicaPolibiuszSzyfrowanie(char litera)
{



	    	if(litera=='a' || litera=='A')
				return 	11;
	        else if(litera=='b' || litera=='B')
				return 	12;
		    else if(litera=='c' || litera=='C')
				return 	13;
		    else if(litera=='d' || litera=='D')
				return 	14;
			else if(litera=='e' || litera=='E')
				return 	15;
		    else if(litera=='f' || litera=='F')
				return 	21;
			else if(litera=='g' || litera=='G')
				return 	22;
			else if(litera=='h' || litera=='H')
				return 	23;
			else if(litera=='i' || litera=='j' || litera=='J' || litera=='I')
				return 	24;
			else if(litera=='k' || litera=='K' )
				return 	25;
			else if(litera=='l' || litera=='L' )
				return 	31;
			else if(litera=='m' || litera=='M' )
				return 32;
			else if(litera=='n' || litera=='N' )
				return 	33;
			else if(litera=='o' || litera=='O' )
				return 34;
			else if(litera=='p' || litera=='P' )
				return 	35;
			else if(litera=='q' || litera=='Q' )
				return 	41;
			else if(litera=='r' || litera=='R' )
				return 	42;
			else if(litera=='s' || litera=='S' )
				return 43;
			else if(litera=='t' || litera=='T' )
				return 	44;
			else if(litera=='u' || litera=='U' )
				return 	45;
			else if(litera=='v' || litera=='V' )
				return 	51;
			else if(litera=='w' || litera=='W' )
				return 52;
			else if(litera=='x' || litera=='X' )
				return 	53;
			else if(litera=='y' || litera=='Y' )
				return 	54;
			else if(litera=='z' || litera=='Z' )
				return 	55;


}

char tablicaPolibiuszDeszyfrowanie(int litera)
{




	    	if(litera==11)
				return  'a';
	        else if(litera==12)
				return 	'b';
		    else if(litera==13)
				return 	'c';
		    else if(litera==14)
				return 	'd';
			else if(litera==15)
				return 	'e';
		    else if(litera==21)
				return 	'f';
			else if(litera==22)
				return 	'g';
			else if(litera==23)
				return 	'h';
			else if(litera==24)
				return 	'i';
			else if(litera==25 )
				return 	'k';
			else if(litera==31 )
				return 	'l';
			else if(litera==32 )
				return 'm';
			else if(litera==33)
				return 	'n';
			else if(litera==34)
				return 'o';
			else if(litera==35 )
				return 	'p';
			else if(litera==41 )
				return 	'q';
			else if(litera==42)
				return 'r';
			else if(litera==43)
				return 's';
			else if(litera==44 )
				return 't';
			else if(litera==45 )
				return 	'u';
			else if(litera==51 )
				return 'v';
			else if(litera==52)
				return 'w';
			else if(litera==53 )
				return 'x';
			else if(litera==54)
				return 'y';
			else if(litera==55)
				return 'z';

}

int dodajLitere(int a)
{

	struct zakodowane *wsk;
	struct zakodowane *nowy;

	wsk = kolejneLitery;
	while( wsk->next != NULL )
	{
		wsk=wsk->next;
	}
	nowy=(struct zakodowane*)malloc(sizeof(struct zakodowane));
	nowy->wartosci=a;
	nowy->next=NULL;
	wsk->next=nowy;
	wsk = nowy;
 }

 int dodajOdkodowane(char a)
{

	struct odkodowane *wsk;
	struct odkodowane *nowy;
	wsk = odkodwaneLitery;
	while( wsk->next != NULL )
	{
		wsk=wsk->next;
	}
	nowy=(struct odkodowane*)malloc(sizeof(struct odkodowane));
	nowy->litery=a;
	nowy->next=NULL;
	wsk->next=nowy;
	wsk = nowy;
}

void wypisz()
{
	struct zakodowane *pomocniczy;
	struct zakodowane *pomocniczy2;
	pomocniczy=kolejneLitery;
	pomocniczy2=kolejneLitery;
	FILE *zakodowaneLitery;
	zakodowaneLitery=fopen("zakodowaneLitery.txt", "w");

	while( pomocniczy->next != NULL)//zapis na ekran
	{
		printf("%d ",pomocniczy->wartosci);
		pomocniczy=pomocniczy->next;
	}
		printf("%d ",pomocniczy->wartosci);

    while( pomocniczy2->next != NULL) //zapis do pliku
	{
		fprintf(zakodowaneLitery,"%d ",pomocniczy2->wartosci);
		pomocniczy2=pomocniczy2->next;
	}
		fprintf(zakodowaneLitery,"%d ",pomocniczy2->wartosci);
		fclose(zakodowaneLitery);
}
void wypisz2()
{
	struct odkodowane *pomocniczy;
	struct odkodowane *pomocniczy2;

	pomocniczy=odkodwaneLitery;
	pomocniczy2=odkodwaneLitery;
	FILE *odkodowaneLitery;
	odkodowaneLitery=fopen("odkodowaneLitery.txt", "w");


    printf("\nODKODOWANE:");
	while( pomocniczy->next != NULL)
	{
		printf("%c",pomocniczy->litery);
		pomocniczy=pomocniczy->next;
	}
		printf("%c\n",pomocniczy->litery);




		while( pomocniczy2->next != NULL)
	{
		fprintf(odkodowaneLitery, "%c" , pomocniczy2->litery);
		pomocniczy2=pomocniczy2->next;
	}
		fprintf(odkodowaneLitery,"%c",pomocniczy2->litery);
		fclose(odkodowaneLitery);

}

void gwiazdki()
{
printf("********************************************************************************");
}

0
int tablicaPolibiuszSzyfrowanie(char litera) { return litera+11-(isupper(litera)?'A':'a'); }
char tablicaPolibiuszDeszyfrowanie(int litera) { return litera+'a'-11; }

Zauważ że znaki mogą przechowywać małe liczby.
Więc że wszystkich struktur jedynie czego potrzebujesz to ciągu znaków.

0

ok zmienię to, te dwa poprzednie błędy już wyeliminowałem, w ifach, gdzie alokuje pamięć wystarczyło dopisać i=0

ale teraz mam nowy problem, nie mogę zwolnić listy próbowałem w sposób jak niżej, ale nie zwalnia i dodatkowo wyskakuje błąd przy zapętleniu programu

void usunListe()
{
     struct zakodowane *wsk;
     wsk=kolejneLitery;
     while( wsk->next != NULL )
     {

     free(wsk);
     wsk=wsk->next;


     }
     kolejneLitery->next=NULL;
}
0

Zwalniasz pamięć, a potem próbujesz przesunąć wskaźnik wsk na wskaźnik next, ale tam nic nie ma.
Po wywołaniu funkcji free(wsk), zmienna wsk nie ma wartości null, więc nawet jakbyś sprawdził

if(wsk == NULL) return;

bo wsk jest "wiszącym wskaźnikiem", przemień kolejność w pętli.

0

Dzięki, zrobiłem tak i działa:

void usunListe()
{
struct struktura *wsk;
struct struktura *temp;
wsk = doZlamania;
while(wsk != NULL)
    {
    temp = wsk;
    wsk = node->next;
    free(temp);
    }
doZlamania=NULL;

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1