DOMANDA cifrario di cesare e scacchiera di polibio

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
Son pienamente d'accordo con @DispatchCode , non vi è alcun segmentation fault. Il compilatore è ovviamente a conoscenza della memoria allocata, perche' non stampa?
Perchè printf cerca il pattern specificato ovvero una stringa 0 terminata. Nel suo codice non c'è.
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Perchè printf cerca il pattern specificato ovvero una stringa 0 terminata. Nel suo codice non c'è.

Non è esattamente quello il motivo: se fosse come dici si vedrebbero a schermo caratteri 'a caso' o dati senza senso; qui non si vede nulla, perchè in realtà la printf si ferma subito, al primo carattere. Quell'array infatti contiene 26 posizioni a 0, quindi la printf si ferma alla prima e non si vede niente.

Compilando questo invece:
C:
#include <stdio.h>

int main()
{
    char A[26]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X','Y','Z'};
    char B[26]={'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X','Y','Z','A', 'B', 'C'};
    char P[26];
    char RI[26];
    int i;
        printf("Inserire parola:  ");
        scanf("%s", P);
    
    for(i=0;i<26;i++)
    {
        if(P[i] == A[i])
            {
              RI[i]=B[i]; 
            }
    }
    
    RI[0] = 'A';
    
    printf("Frase: %s", RI);
    return 0;
}

si vede a schermo 'A', perchè la locazione dopo è NULL terminata.
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
Non è esattamente quello il motivo: se fosse come dici si vedrebbero a schermo caratteri 'a caso' o dati senza senso; qui non si vede nulla, perchè in realtà la printf si ferma subito, al primo carattere. Quell'array infatti contiene 26 posizioni a 0, quindi la printf si ferma alla prima e non si vede niente.

Compilando questo invece:
C:
#include <stdio.h>

int main()
{
    char A[26]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X','Y','Z'};
    char B[26]={'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X','Y','Z','A', 'B', 'C'};
    char P[26];
    char RI[26];
    int i;
        printf("Inserire parola:  ");
        scanf("%s", P);
   
    for(i=0;i<26;i++)
    {
        if(P[i] == A[i])
            {
              RI[i]=B[i];
            }
    }
   
    RI[0] = 'A';
   
    printf("Frase: %s", RI);
    return 0;
}

si vede a schermo 'A', perchè la locazione dopo è NULL terminata.
In teoria l'inizializzazione a 0 non è garantita,RI contiene valori a caso. In ogni caso gli errori nel codice sono molteplici, volevo sottolineare che la printf cerca un pattern stringa e quindi un array di caratteri 0 terminati
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
In teoria l'inizializzazione a 0 non è garantita,RI contiene valori a caso. In ogni caso gli errori nel codice sono molteplici, volevo sottolineare che la printf cerca un pattern stringa e quindi un array di caratteri 0 terminati

Sisi certo. In questo caso è a 0 probabilmente perchè sullo stack non c'era niente in precedenza.
Sarebbe infatti meglio inizializzarlo esplicitamente, tipo con char RI[26] = {'\0'};.
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
Esatto, dunque ricapitolando
Printf protrebbe non stampare nulla poichè non trova il pattern \0 o magari è il primo carattere essendo RI a caso.
Il compilatore è sempre a conoscenza delle inizializzazioni statiche e la memoria è sempre allocata.
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Va bene, prova a verificare.

Mi sembra molto strano il segmentation fault, poichè la memoria a cui accede è valida; inoltre è tutto sullo stack e non è una dimensione così grande da giustificare quel tipo di errore (viene restituito ad esempio se cerchi di allocare un numero di elementi superiore alla dimensione dello stack).
Tipo se compili modificando l'array RI in questo modo: char RI[10000000000000]; ottieni un segmentation fault.
La versione di gcc è la 12.2.0
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux

Francesco C.

Utente Attivo
264
40
CPU
Intel Celeron
HDD
SSD 256 GB
RAM
4GB di ram
Monitor
Integrato nel PC
Net
FTTC Vodafone 200mb
OS
Windows 10 Home 64bit
Sono studente di 5 anno... non ho ancora fatto i codici ASCII oper questo l'ho fatto utilizzando più array.
Alla fine più o meno ero riuscito a farlo... solo che di CIAO controllava solamente C e I

Non aprivo il forum da qualche giorno perchè non ho ricevuto le notifiche.

Grazie mille a tutti
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
La versione di gcc è la 12.2.0

La versione è sicuro ok. Magari crasha sulla printf, poiché ci sono dati sporchi e va avanti a leggere.

Dovresti provare a debuggare, per curiosità.
 

bigendian

Utente Attivo
738
424
OS
Linux
posta il codice e la parola che immetti

(ps: per gioco, l'avrei fatto cosi')

C:
#include <stdio.h>

int main(int argc, char **argv)
{
    char cifrario[] = {"DEFGHIJKLMNOPQRSTUVWXYZABC"};
    char *p = argv[1];

    if (argc != 2) {
        printf("usage: %s parola\n", argv[0]);
        return 1;
    }

    while (*p) {
        char l = *p++;
        if ((l >= 'a') && (l <= 'z'))
            putchar(cifrario[l - 'a'] + 0x20);
        else if ((l >= 'A') && (l <= 'Z'))
            putchar(cifrario[l - 'A']);
    }
    putchar('\n');

    return 0;
}
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Gia fatto, si blocca sull'if nel for, dopo aver confrontato tutte le lettere presenti

A parte il codice, che presumo sia quello del primo post copiato e incollato, puoi allegare l'eseguibile prodotto dal compilatore? Dovresti riusce a caricarlo se lo zippi, altrimenti usa qualche servizio esterno.
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Allora, non mi restituisce più segmentation fault (però non ho toccato niente). Quello che c'era di sbagliato era che RI[j]=B[j]; aveva j come indice anche su RI, e non l'avevo notato. Quindi andava a mettere lettere a caso in posti a caso, andando a stampare solo la prima lettera, visto che dopo aveva molti byte a 0.
 
  • Mi piace
Reazioni: ilfe98

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili