Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    [C] cifrario a chiave personalizzata problema ultime lettere

    Salve a tutti, stavo creando una funzione per un cifrario di cesare con chiave scelta dall'utente, in un range 0-26. Per vedere se funzionava ho inserito tutto l'alfabeto, e funziona bene tranne per le ultime 5 lettere (vwxyz). Qualcuno sa dirmi il perchè?

    Questa è la funzione:

    codice:
    void cifrarioPersonalizzato(){
        char stringa[DIM_STR];
        int i, chiave;
        // Acquisizione chiave
        printf("# Inserisci la chiave (0-26).\n");
        printf("Chiave: ");
        scanf("%d", &chiave);
        while(chiave<0 || chiave>26){
            printf("Chiave errata.\nValore minimo: 0, valore massimo: 26.\n");
            printf("Chiave: ");
            scanf("%d", &chiave);    
        }
        // Acquisizione stringa
        printf("\n# Inserisci la frase.\n");
        printf("MAX 150 caratteri, NO maiuscolo.\n");
        printf("Frase: ");
        fflush(stdin);
        gets(stringa);
        // Cifratura
        for(i=0; i<strlen(stringa); i++){
            if(stringa[i]>='a' && stringa[i]<='z'){
                stringa[i]=stringa[i]+chiave;
                // Se supera la z deve ricominciare dalla a 
                // Quindi tolgo 26 (alfabeto di 26 lettere)
                if(stringa[i]>'z')
                    stringa[i]=stringa[i]-26;
            }   
        }
        printf("\nLa frase criptata e': %s\n\n", stringa);
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E DIM_STR quanto vale?

    Con quale input hai problemi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da oregon
    E DIM_STR quanto vale?

    Con quale input hai problemi?
    DIM_STR vale 150. Il problema è nell'output, credo. Perchè l'algoritmo funge per quasi tutta la stringa, da problemi alle ultime 5 lettere dell'alfabeto (v, w, x, y, z). Se inserisco altre lettere (tipo : "appuntamento ore dieci"), non mi da problemi. Non capisco perchè..

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma con quale input (chiave, stringa) ... ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da oregon
    Ma con quale input (chiave, stringa) ... ?
    Ah ok, non avevo inteso cosa volevi dire. Bene o male con quasi tutte le chiavi. Se inserisco 10 le sbaglia tutte, se inserisco 8 sbaglia solo le ultime tre. Se inserisco 6 sbaglia l'ultima. Non capisco.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il fatto è che i char hanno un segno ... Prova con

    if((unsigned char)stringa[i]>'z')
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da oregon
    Il fatto è che i char hanno un segno ... Prova con

    if((unsigned char)stringa[i]>'z')
    Adesso funziona! Grazie!
    In che senso i char hanno un segno ? puoi spiegarmi meglio?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il valore di un char, da un punto di vista numerico, è compreso tra -128 e +127

    Il valore ascii di z è 122 ... se sommi 6, non diventa 128 ma -128 e la if fallisce.
    Devi indicare nella if che il valore deve essere inteso unsigned (da 0 a 255) e allora il confronto avviene tra 128 e z ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da oregon
    Il valore di un char, da un punto di vista numerico, è compreso tra -128 e +127

    Il valore ascii di z è 122 ... se sommi 6, non diventa 128 ma -128 e la if fallisce.
    Devi indicare nella if che il valore deve essere inteso unsigned (da 0 a 255) e allora il confronto avviene tra 128 e z ...
    Ok, grazie mille
    Tutto chiaro, mi chiedo perchè ai corsi universitari non ci dicano certe cose

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da goatboy
    perchè ai corsi universitari non ci dicano certe cose
    Forse le danno per scontate ... o le dicono e vengono sottovalutate dagli studenti ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.