Crittografia

di il
5 risposte

Crittografia

Ciao avrei anche questo algoritmo da risolvere:
Sii considera una cartella di corrispondenze contenuta in un file in cui ogni riga contiene la corrispondenza nella forma [<carattere originale>] [<carattere sostituito>]. I soli caratteri possibili sono l'alfabeto minuscolo.
ad es
[a]
[k]
[c] [m]
Devo scrivere una funzione che prende come parametri il nome di un file di corrispondenze, una stringa da decifrare e una stringa che conterrà il testo cifrato. La funzione dovrà scrivere nella seconda stringa il contenuto della prima decifrato il base alle corrispondenze contenute nel file.
Io ho svolto il problema in questo modo (ovviamente credo che non sia corretto).
Qualche osservazione?
#include <stdio.h>
#include <string.h>
#define DIM 5
#define DIM_MAX 100
struct Cifratura{
	char originale[DIM];
	char cifrato[DIM];
};
void ConvertiStringa(char nome_file, char originale[], char cifrato[]);
void ConvertiCarattere(struct Cifratura v[], char originale[], char cifrato[]);
int main(int argc, char* argv[]){
	char stringa_cifrata[DIM_MAX];
	ConvertiStringa(argv[1], argv[2], stringa_cifrata);
	printf("La stringa tradotta: %s\n", stringa_cifrata);
	return 0;
}
void ConvertiStringa(char nome_file, char originale[], char cifrato[]){
	FILE *fp;
	int i, j;
	struct Cifratura v[DIM_MAX];
	char car_or[DIM], car_cif[DIM];
	char cifrato[DIM_MAX];
	fp=fopen(nome_file, "r");
	if(!fp)
		printf("Errore lettura file!\n");
		return -1;
	while(fscanf(fp,"%*s%s%*s %*s%s%*s", car_or, car_cif)!=EOF);
	fp=fclose;
	i=0;
	j=0;
	while(car_or[i]!='\0'){
		v[j].originale=car_or[i];
		v[j].cifrato=car_cif[i];
		i++;
		j++;
	}
	i=0;
	while(car_or[i]!=0){
		cifrato[i]=ConvertiCarattere(v, originale, cifrato);
		i++;
	} cifrato[i]='\0';
}
void ConvertiCarattere(struct Cifratura v[], char originale[], char cifrato[]){
	int i=0;
	while(strcmp(v[i].originale, originale)!=0){
		continue;
		strcpy(cifrato, v[i].cifrato);
		i++;
	}
	return;
}

5 Risposte

  • Re: Crittografia

    Puoi per cortesia leggere il regolamento e in più specifico la Sezione 4. Formattazione del codice.
    Impara ad aiutare gli altri a farti aiutare.
  • Re: Crittografia

    Hai ragione...scusate!
  • Re: Crittografia

    Questo non mi convince
    
    while(fscanf(fp,"%*s%s%*s %*s%s%*s", car_or, car_cif)!=EOF);
       fp=fclose;
    
    Quante volte stai leggendo le due stringhe dal file?
    poi quel fp = fclose; non credi ci sia qualcosa che non va?
    
    void ConvertiCarattere(struct Cifratura v[], char originale[], char cifrato[]){
       int i=0;
       while(strcmp(v[i].originale, originale)!=0){
          continue;
          strcpy(cifrato, v[i].cifrato);
          i++;
       }
       return;
    }
    
    il continue fa si che le righe sotto non vengano mai raggiunte.
  • Re: Crittografia

    Quello che pensavo era di leggere il file e salvare i caratteri originali in una stringa e quelli abbinati in un'altra stringa, il file lo leggo una volta e poi lo devo chiudere.

    Per la seconda parte dici che non serva il comando continue? Io intendevo confrontare i caratteri, continuare il confronto fino a che non trovo la condizione di uguaglianza e poi restituire il carattere corrispondente.

    Grazie
  • Re: Crittografia

    Tu stai leggendo due stringhe per volta. Da notare che hai specificato %s. Ogni volta che leggi il contenuto delle due stringhe viene sovrascritto.

    Il continue invece serve per saltare l'iterazione del indice corrente e molto probabilemente (così com'è strutturata) la funzione o rimane in loop infinito oppure esce subito.
    Non hai specificato la grandezza del vettore delle strutture quindi non sai quand'è che hai finito di fare i confronti.
    In fine utilizzando il debugger dovresti riuscire a capire meglio dov'è che sbagli.
Devi accedere o registrarti per scrivere nel forum
5 risposte