Szyfr cezara C

0

Hej, mam pewien problem w kodzie. Dopiero niedawno zaczęłam przygodę z programowaniem (z racji fanaberii studiowania informatyki) więc jestem świeżakiem.
Mój problem dotyczy dekodowania wiadomości zapisanej w pliku. Program koduje wiadomość, jednakże jeśli chodzi o dekodowanie wczytuje plik przed zaszyfrowaniem (co daje nowe zaszyfrowanie z przesunięciem w drugą stronę zamiast rozszyfrowania pliku po). Wiem, że wczytanie pliku powinno być w innym miejscu, jednakże nic nie przychodzi mi do głowy :C Gdzie popełniam błąd?

P.S. Jakie książki polecacie (bądź dobre strony) do nauki C i C++?

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

int main()
{
    int a;
    char tab[100];
    char komenda;
    
    printf("Aby zakodowac wcisnij (1), w celu odkodowania wcisnij (2)\n");
    scanf("%s", &komenda);
    printf("Podaj klucz przesuniecia: ");
    scanf("%d", &a);
    
    FILE * fp;

   fp = fopen ("przed.txt", "r");
   
   fscanf(fp, "%s", tab);

   fclose(fp);
   
for(int i=0;i<100;i++)
 {
    	switch(komenda)
    	{
    	case '1': 
    	
			if(tab[i]>=32 && tab[i]<=122-a) {
            tab[i]=int(tab[i])+a; 
        	}
 
        	else if(tab[i]>=122 && tab[i]<=32) {
            tab[i]=int(tab[i])-91+a; 
        	}
			break;
           			
    		case '2':
   
    		if(tab[i]>=32 && tab[i]<=122-a) {
            tab[i]=int(tab[i])-a; 
            }
 
            else if(tab[i]>=122+a && tab[i]>=32) {
            tab[i]=int(tab[i])+91-a; 
            }
            break;
    			
    }
}
   			
printf("%s", tab);

FILE *fd;
   fd=fopen ("po.txt", "a");
     
   fprintf (fd, "%s", tab);
   fclose (fd);
    return 0;	
}
0
  1. Błąd numer 1: scanf("%s", &komenda); komenda to char a nie tablica charów. %s wczyta zawsze przynajmniej 1 znak plus nullbyte na końcu. W efekcie nadpisujesz sobie tu od razu coś w tablicy tab. Fakt że potem czytasz do tej tablicy więc akurat nie ma tragedii, ale można by ten buffer overflow wykorzystać do eksploitowania tej aplikacji. Jeśli chcesz czytać znak to czytaj %c albo zrób tam przynajmniej char komenda[2] i wczytuj %2s
  2. Błąd numer 2: fscanf(fp, "%s", tab); skąd wiesz że plik się zmieści do tej tablicy? Wczytuj tylko tyle znaków ile masz w tym buforze a nie cały plik...
  3. Błąd numer 3: for(int i=0;i<100;i++) czemu lecisz 100 znaków skoro można było wczytać mniej? Czemu nie sprawdzisz jakimś strlen ile znaków wczytano?
  4. Kolejny błąd: switch(komenda) czemu ten switch w pętli? Czemu nie zrobić osobno funkcji do szyfrowania i deszyfrowania i switch zrobić tylko raz? Przecież operacja się już nie zmieni.
  5. Nie bardzo rozumiem problem. Przecież otwierasz nie ten plik, to czego się spodziewasz? Przekazuj może do programu nazwy plików jako argumenty?
0

Przeanalizuję wszystko na spokojnie i mam nadzieję, że dam radę. Dziękuję bardzo za odpowiedź!

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