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

Odpowiedz Nowy wątek
2015-01-16 23:57
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("********************************************************************************");
}

Pozostało 580 znaków

2015-01-17 00:10
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-17 12:11
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;
}
edytowany 1x, ostatnio: dominik123, 2015-01-17 12:12

Pozostało 580 znaków

2015-01-17 13:42
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.

edytowany 2x, ostatnio: _borisov8, 2015-01-17 13:44

Pozostało 580 znaków

2015-01-17 16:23
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;

}
Też pare razy sie naciąłem na takie coś, niby wskaźnik nie był NULL ale sigsegv był :p - _borisov8 2015-01-17 16:26

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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