DOMANDA cifrario di cesare e scacchiera di polibio

Pubblicità
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'è.
 
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.
 
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
 
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'};.
 
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.
 
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
 
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
 
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:
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.
 
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.
 
Pubblicità
Pubblicità
Indietro
Top