C: scrivere una libreria contenente una funzione di crittazione

di Anonimizzato21674 il
14 risposte
Buongiorno, scrivo in C, e ho problemi con il seguente esercizio:

"Data una chiave di crittazione costituita da una parola di 3 lettere, la crittazione di una frase avviene aggiungendo al codice ASCII della lettera i-esima il codice ASCCI della lettera (i%3)-esima della chiave. Scrivere una libreria in cui sia presente una funzione di crittazione (che prenda in input una frase, la chiave di crittazione e ritorni la frase crittata). Scrivere un header per facilitare l'utilizzo della libreria. Scrivere un programma per testare il funzionamento delle funzioni di libreria."

Ho pensato alla seguente soluzione, però, quando testo il programma, sul terminale non mi appaiono le scritture corrispondenti ai %s, %d.. Credo che il difetto sia nel malloc.. Potreste aiutarmi? Grazie per la disponibilità.

#include <string.h>
#include <stdlib.h>

char *messaggio(char *frase, char chiave []) {
int i;
int len = strlen(frase);
char *new = (char *) malloc(len+1);
for(i=0; i<=len; i++) {
new = frase + chiave[i%3];
}

return new;
}


Ricavo la libreria "es4.h":
extern char *messaggio(char *frase, char key[]);

Ed, infine, passo al main:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "es4.h"

int main() {
char word[20];
char key[3];
char *str2;
int i;

printf("inserisci frase: ");
scanf("%[^\n]", &word);
getchar();
printf("inserisci chiave: ");
scanf("%[^\n], &key);

str2 = messaggio(word, key);

printf("la frase crittata e' %s\n", str2);
free(str2);
return 0;
}

14 Risposte

  • Usa i tag CODE per mostrare il codice nel forum ...

    Non si capisce se è un problema di copia-incolla ma qui

    scanf("%[^\n], &key);

    mancano le virgolette ...
  • Chiedo scusa, ma sono nuovo e non so come comportarmi.. ho semplicemente ricopiato il codice, quindi non e' codesto il problema..
  • Se la chiave è di 3 caratteri devi scrivere

    char key[4];

    altrimenti non c'è il terminatore.
  • E poi, nella funzione, non devi usare nel ciclo <= perché così cripti anche il carattere terminatore. Dovrai scrivere
    
    	for (i = 0; i < len; i++) {
    		n[i] = frase[i] + chiave[i % 3];
    	}
    	n[i] = '\0';
    
    P.S. Ho usato n e non new perché new è una parola riservata e potrebbe dare degli errori se usi un compilatore C++
  • Intanto grazie mille per la velocità! Che errori banali

    Adesso considera i %s etc.. però stampa punti interrogativi..
  • Come compili? Usi Unicode?

    Quali dati hai fornito in input?
  • Uso gcc. Come frase ho inserito "frase di prova" e come chiave "key"
  • Io vedo

    -++¦-Ö-+Ö¦+Fߦ

    (in una console Windows)
  • Io no.. Ottengo punti interrogativi bianchi su un esagono nero anche se metto le frasi di prima in carattere maiuscolo
  • Linux?
  • Sì, debian
  • Usa %X e stampa ogni singolo carattere come hex. Cosi controlli che il valore calcolato sia giusto
  • Non visualizzi i caratteri ASCII estesi .... è dipendente dalla configurazione del terminale del sistema in uso.

    Puoi seguire il consiglio di LP per capire se il programma funziona ...
  • Nonostante non riesca a leggere, il codice funziona. Grazie ancora.
Devi accedere o registrarti per scrivere nel forum
14 risposte