Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [c++] semplice codice di cripting

    Ho intenzione di imparare il cpp e ho pensato di fare un esempio di cripting per gestire i puntatori.
    Il codice seguente non funziona molto bene in quanto mi restituisce più byte di quello che dovrebbe; solo che non capisco perchè!

    codice:
    void main(){
    
    	char* strToCrypt=new char[6];
    	strToCrypt="Roberta";
    
    	cout << strToCrypt << " -> " << cripta(strToCrypt) << "\n";
    
    } //main.
    
    
    //function cripta
    char* cripta(char* word) 
    
    {
    
    char pos[14];
    
    int lenword=strlen(word);
    if (lenword >=15) {
    cerr << "inserisci massimo 15 caratteri! \n";
    exit(0);
    }
    
    pos[0]=84;
    pos[1]=104;
    pos[2]=101;
    pos[3]=32;
    pos[4]=115;
    pos[5]=101;
    pos[6]=116;
    pos[7]=117;
    pos[8]=112;
    pos[9]=32;
    pos[10]=112;
    pos[11]=114;
    pos[12]=111;
    pos[13]=99;
    pos[14]=101;
    
    char c;
    char c_;
    
    char* str = (char *)malloc(strlen(word));
    //char* str = new char[lenword];
    
    for (int k=0; k<lenword; k++) {
    	c=word[k];
    	c_=(char)(c+pos[k]);
    	str[k]=c;
    } 
    
    
    return str; //La stringa restituisce caratteri che non centrano nulla, qual' è il problema? Grazie!
    
    }
    jabjoint

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    I problemi del tuo codice (a parte l'ottimizzazione, ma non e' importante adesso ...) sono:

    1) non devi scrivere

    pos[14]=101;

    perche' gli elementi sono 14 e quindi da 0 a 13

    2) questa riga nel ciclo deve usare la variabile c_ e non la c

    str[k]=c_;

    3) subito dopo la fine della for e prima del return devi inserire il terminatore nella stringa

    str[k]=0;

    (attenzione al massimo numero di caratteri che puoi trattare ... considera il terminatore)

    4) nel main non puoi assegnare la stringa senza la strcpy

    strcpy(strToCrypt, "Roberta");

  3. #3
    Era di questo terminatore che avevo fondamentalmente bisogno: str[k]=0; di cui non avrei mai immaginato l' esistenza! Grazie tante.

    Nel punto 1. per quanto riguarda gli elementi ci avevo pensato, non sono 14, sono 15 da 0-14.
    - Ah ho capito dovevo fare >15 non >=15.

    Nel punto 2. Ho inserito la c per verificare se ritornava lo stesso identico valore di partenza.

    Il punto 3 era il problema.

    Nel punto 4 non ho capito perchè è sbagliato, Il compilatore non mi da errore, e sembra assegnare correttamente il valore?

    Per l' ottimizzazione se puoi dirmi come migliorarlo ti ringrazio!
    jabjoint

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da jabjoint
    Era di questo terminatore che avevo fondamentalmente bisogno: str[k]=0; di cui non avrei mai immaginato l' esistenza!
    Beh ... e' un elemento di base per la gestione delle stringhe C ... devi tenerlo sempre presente ...

    Che tu non ci abbia mai avuto a che fare vuol dire che hai saltato il capitolo delle stringhe del tuo libro di C. E prima dei puntatori, le stringhe le devi sapere usare ...

    Originariamente inviato da jabjoint
    Nel punto 1. per quanto riguarda gli elementi ci avevo pensato, non sono 14, sono 15 da 0-14.
    - Ah ho capito dovevo fare >15 non >=15.
    Non e' solo questo ... devi indicare 15 elementi nell'array e non 14.

    Originariamente inviato da jabjoint
    Nel punto 4 non ho capito perchè è sbagliato, Il compilatore non mi da errore, e sembra assegnare correttamente il valore?
    Non hai errori ma un memory leak a runtime di cui non ti accorgi perche' il programma e' molto semplice e termina prima che possa dare problemi.

    Quando allochi memoria tramite un puntatore, in quest'ultimo viene passato l'indirizzo del blocco di memoria allocato che tu puoi usare copiandoci la stringa. Se invece in seguito associ il puntatore ad una stringa costante, perdi il valore del primo puntatore e gli assegni il nuovo. L'area allocata in partenza non e' piu' liberabile da cui il memory leak.

    In realta' in questo codice manca la free che dovrebbe sempre essere usata quando il blocco di memoria non serve piu'. Ti accorgeresti dell'errore.

    Rivedi l'uso dei puntatori.

    Originariamente inviato da jabjoint
    Per l' ottimizzazione se puoi dirmi come migliorarlo ti ringrazio!
    Certo ... quando avro' un po' di tempo te ne proporro' una versione un po' piu' "sistemata" ... a meno che non mi preceda qualche altro "volenteroso" ...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.