Cifrario di cesare con errori
Esaminate il programma che trovate in calce, rilevate gli errori e correggeteli.
Il programma deve:
- ricevere da linea di comando un parametro che può essere C oppure D
- leggere da standard input un testo formato da caratteri alfabetici minuscoli o maiuscoli, cifre, spazi, punteggiatura, ecc, e terminato da a-capo
- leggere da standard input un numero k compreso tra 1 e 25
- se il parametro è C: cifrare il testo inserito usando il cifrario di cesare di chiave k (vedi sotto per la descrizione di come funziona il cifrario)
- se invece il parametro è D: decifrare il testo inserito usando il cifrario di chiave k
- stampare un messaggio contenente il testo inserito e quello cifrato/decifrato.
Per ogni correzione, annotate un commento che spiega qual era l'errore e come l'avete corretto.
NOTA IMPORTANTE: effettuate le modifiche necessarie a correggere gli errori ma senza stravolgere il programma.
Cifrario di Cesare:
Ogni lettera viene sostituita dalla lettera che la segue di k posti nell’alfabeto. Ad esempio se k vale 3, la lettera 'A' è sostituita dalla 'D', la 'B' dalla 'E' e così via fino alle ultime lettere che sonocifrate ripartendo dall’inizio dell’alfabeto (ad esempio 'Z' è sostituita con la 'C').
Il numero k è detto chiave di cifratura, mentre il messaggio che si ottiene è chiamato testo cifrato.
Ad esempio:
- testo in chiaro: "Il cielo sopra il porto aveva il colore della televisione sintonizzata su un canale morto"
- chiave di cifratura k = 8
- testo cifrato: "Qt kqmtw awxzi qt xwzbw idmdi qt kwtwzm lmtti bmtmdqaqwvm aqvbwvqhhibi ac cv kivitm uwzbw"
Nota: per verificare se avete cifrato correttamente un testo con una certa chiave k, applicate al testo cifrato una nuova cifratura con chiave 26−k: dovrete ritrovare il testo originale!
Esempio 1
Eseguendo
./Soluzione C
e avendo nel flusso di ingresso:
mamma, li Turchi!
5
il programma emette sul flusso di uscita
Testo inserito: mamma, li Turchi!
Testo cifrato: rfrrf, qn Yzwhmn!
Esempio 2
Eseguendo
./Soluzione D
e ricevendo da standard input
rfrrf, qn Yzwhmn!
5
il programma emette sul flusso di uscita
Testo inserito: rfrrf, qn Yzwhmn!
Testo decifrato: mamma, li Turchi!
Programma da correggere
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define N 100
char cifra( char c, int k );
int main( int argc, char *argv[] ) {
int k, i = 0;
char op = argv[0];
char testo[N];
char *modificato;
while ( ( testo[i] = getchar() ) != '\n' ) {
i++;
}
scanf( "%d", &k );
if ( op == 'D' )
k = k * -1;
i = 0;
while ( testo[i] != '\0' ) {
modificato[i] = cifra( testo[i], k );
i++;
}
printf ( "Testo inserito: %s\n", testo );
if ( op == 'C')
printf ( "Testo cifrato:" );
else
printf ( "Testo decifrato:");
printf ( " %s\n", modificato );
return 0;
}
char cifra( char c, int k) {
if ( isalpha( c ) ) {
for (int j=1; j<=k; j++) {
if ( c != 'z' )
c++;
else
c = 'a';
}
}
else return c;
}