DOMANDA Qualcuno che mi aiuta capire un codice scritto in c?

Pubblicità
lascia perde sono ciecato?
--- i due messaggi sono stati uniti ---

Come dovrei fare quindi? Cioè dovrei agire a livello di codice?

Incolla anche il codice che hai usato per favore (quello che stai compilando), così vediamo.
Nonl inkare solo il post, incollalo proprio.

Il file di testo mi sembra ok, guardandolo da hex editor non ho visto degli "a capo".
 
Incolla anche il codice che hai usato per favore (quello che stai compilando), così vediamo.
Nonl inkare solo il post, incollalo proprio.

Il file di testo mi sembra ok, guardandolo da hex editor non ho visto degli "a capo".
C:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
 
int table[26][52];
 
void init_matrix()
{
    int i, j;
 
    for (i = 0; i < 26; i++)
    {
        for (j = 0; j < 52; j++)
        {
        table[i][j] = (j + i) % 26;
        }
    }
}
 
void encrypt(char *filename, char *key, int n)
{
    int i, count = 0, size = 0;
    char ch;
 
    FILE *in, *out;
    in = fopen(filename, "r");
    if (in == NULL)
    {
        printf("Impossibile aprire il file.\n");
        exit(1);
    }
 
    out = fopen("TestoCifrato.txt", "w+");
    if (out == NULL)
    {
        printf("Impossibile aprire il file.\n");
        exit(1);
    }
 
    fseek(in, 0, SEEK_END);     // cerco di terminare il file
    size = ftell(in);           // ottiene il puntatore al file corrente
    fseek(in, 0, SEEK_SET);     // cerca di tornare all'inizio del file
 
    for (i = n; i < size - 1; i++) {
        key[i] = key[i - n];
        
    }
 
    while (count != size)
    {
        ch = getc(in);
        if (isupper(ch)) {
            putc(table[key[count] - 65][ch - 65] + 65, out);
        }
        else {
            putc(table[key[count] - 65][ch - 97 + 26] + 97, out);
        }
        count++;
    }
 
    fclose(in);
    fclose(out);
}
 
void decrypt(char *key)
{
    int i, j, size = 0, count = 0;
    char ch;
 
    FILE *in, *out;
    in = fopen("TestoCifrato.txt", "r");
 
    if (in == NULL)
    {
        printf("Impossibile aprire il file contenente il testo criptato.\n");
        exit(1);
    }
 
    out = fopen("TestoDecifrato.txt", "w+");
    if (out == NULL)
    {
        printf("Impossibile aprire il file di decriptazione.\n");
        exit(1);
    }
 
    fseek(in, 0, SEEK_END); // cerco di terminare il file
    size = ftell(in);    // ottiene il puntatore al file corrente
    fseek(in, 0, SEEK_SET); // cerca di tornare all'inizio del file
 
    while (count != size)
    {
        ch = getc(in);
        if (isupper(ch))
        {
            for (i = 0; i < 26; i++)
            {
                if (table[key[count] - 65][i] == ch - 65) {
                    fputc(i + 65, out);
                }
            }
        }
        else {
            for (i = 26; i < 52; i++)
            {
                if (table[key[count] - 65][i] == ch - 97) {
                    fputc(i + 97 - 26, out);
                }
            }
        }
        count++;
    }
    fclose(out);
    fclose(in);
}
 
// funzione principale
int main()
{
    char filename[] = "Testo.txt";
 
    char key[] = "tomsh";
    int n = strlen(key);
 
    int j;
    // converte la chiave in maiuscolo
    for (j = 0; j < n; j++) {
        key[j] = toupper(key[j]);
    }
 
    init_matrix();
 
    // crittografa usando il codice Vigenère
    encrypt(filename, key, n);
 
    // decifrare usando il codice Vigenère
    decrypt(key);
    
    printf("I risultati dell'operazione sono disponibili solamente nei file di testo.");
 
    return 0;
}
 
Ti faccio notare che il codice che stai usando è un misto tra il mio e il suo, che contiene ancora tutti gli errori.
La condizione dell'encrypt corretta è while (count < size-1).

Inoltre fai attenzione a quel ciclo for sulla key:
C:
    for (i = n; i < size - 1; i++) {
        key[i] = key[i - n];
        
    }

Domanda: ho ripetuto nei post precedenti che è un errore grave. Hai chiaro perchè lo è? Prova a spiegarlo. ?
Se non hai capito il motivo, appena posso, ti faccio un esempio.
 
Ti faccio notare che il codice che stai usando è un misto tra il mio e il suo, che contiene ancora tutti gli errori.
La condizione dell'encrypt corretta è while (count < size-1).

Inoltre fai attenzione a quel ciclo for sulla key:
C:
    for (i = n; i < size - 1; i++) {
        key[i] = key[i - n];
       
    }

Domanda: ho ripetuto nei post precedenti che è un errore grave. Hai chiaro perchè lo è? Prova a spiegarlo. ?
Se non hai capito il motivo, appena posso, ti faccio un esempio.
lo so che è sbagliato il codice, però non capisco perché su win funziona bene mentre su linux no..
Riguardo al for so a cosa serve però non so il perché sia sbagliato..
 
lo so che è sbagliato il codice, però non capisco perché su win funziona bene mentre su linux no..

Devi modificare la condizione come ti ho fatto vedere nel post precedente; l'ho provato su Linux prima della modifica, e nell'output del testo cifrato c'era un carattere in più, quindi non funzionava.

Inoltre se invece di "ciao" scrivi qualcosa di più lungo, ti darà un errore di segmentazione.

Comunque basandomi sull'ultimo codice che avevo incollato, mi funzionano entrambi allo stesso modo.

Riguardo al for so a cosa serve però non so il perché sia sbagliato..

Considera questo: l'array che memorizza la chiave in memoria è salvato come:

Codice:
0: t
1: o
2: m
3: s
4: h
5: \0

Ciò che fa quel ciclo for è partire dall'indice 5 e copiare la medesima chiave, sino a che non arriva ala lunghezza del testo. Supponiamo che il testo invece di "ciao" sia "ciaociao", quel for fa questo:

Codice:
// i = 5 SE i < 7; i++
5: t
6: o

In pratica va a scrivere su della memoria che non è stata riservata per quell'array (celle di memoria che si trovano dopo l'ultima che gli è stata riservata).




Come esercizio, prova a modificare completamente l'approccio al problema. Ad esempio, prova a risolverlo usando solo un array e non una matrice.
 
Pubblicità
Pubblicità
Indietro
Top