Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    47

    [C++] Inversione di stringa senza dichiarazione di stringhe di appoggio

    Ciao a tutti....
    Come dice il titolo mi è stato richiesto un programma che deve invertire una stringa, senza però utilizzare all'interno della funzione "inverti" stringhe di appoggio in cui copiare la stringa.
    Per lo svolgimento del programma non si dovrebbe utilizzare alcuna istruzione della libreria <string.h>....

    Non so se possa essere utile a qualcuno, comunque vi posto il codice di una funzione inverti che salva in s2 (stringa) s1 letta al contrario(stringa digitata dall'utente).

    Grazie a tutti!!Ciao!


    void inverti (char *s1, char *s2) //vengono passati due puntatori a stringhe

    {

    int k=0; //indice della lunghezza della stringa 1, purtoppo non si possono utilizzare le funzioni di <sting.h>
    char *p1 = s1;
    char *p2= s2;

    for (;*p1!='\0';p1++) //Calcola la lunghezza di s1
    k++;

    p1--; //Essendo che p1, che punta a s1 in realtà, è stato incrementato fino alla fine adesso "vale" '\0', decerementandolo si torna all' ultimo suo valore prima del char nullo.

    for (int j=0;j<k;j++, p1--, p2++) //Scorro il for k volte, decrementando ad ogni iterazione p1 e aumentando p2, copiando ad ogni passaggio all'interno di *p2 ----->*p1
    {
    *p2=*p1;
    }
    *p2='\0'; //aggiungo il carattere nullo rendendo p2 una stringa valida

    }






    Scusate ma non son bravo nei forum e non so come postare il codice in altro modo...scusatemi ancora

  2. #2
    Be, non so se funziona con tutte le stringhe ma usando l'algoritmo di swap XOR si potrebbe eliminare anche la stringa di appoggio esterna alla funzione:
    codice:
    void invert(char *s)
    {
      int i, ii, l;
      if( !s )
        return;
      l = (int)strlen(s);
      ii = l - 1;
      for( i = 0; i < l / 2; i++, ii--)
      {
        s[i]  = s[i] ^ s[ii];
        s[ii] = s[i] ^ s[ii];
        s[i]  = s[i] ^ s[ii];
      }
    }
    
    ...
    char tmp_s[] = "Pippo";
    invert(tmp_s)
    ...
    In effetti uso la funzione strlen che si trova in string.h...ma calcolare la lunghezza della stringa si fa semplicemente come hai fatto nella tua funzione

  3. #3
    Bellissima la funzione di fastcoder, una cosa + umana prevede solo un carattere di appoggio:

    codice:
    void invert(char *s)
    {
      int i, ii, l;
      char c;
    
      if( !s )
        return;
      l = (int)strlen(s);
      ii = l - 1;
      for( i = 0; i < l / 2; i++, ii--)
      {
        c= s[i];
        s[i] = s[ii];
        s[ii] = c;
      }
    }
    
    ...
    char tmp_s[] = "Pippo";
    invert(tmp_s)
    ...

  4. #4
    Ciao, mi hai fatto pensare che in effetti il codice che ho scritto non era molto efficente (meglio usare i puntatori che l'accesso tramite []), quindi si può ancora fare:
    codice:
    void invert(char *s)
    {
      if( !s )
        return;
      char *i = s;
      char *ii = s;
      
      while( *ii )
        ii++;
      ii--;
    
      while( i != ii )
      {
        // o così
        *i  = *i ^ *ii;
        *ii = *i ^ *ii;
        *i  = *i ^ *ii;
        // o più chiaramente
        char c = *i;
        *i = *ii;
        *ii = c;
        i++;
        ii--;
      }
    }

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Io però non riesco a capirlo, questi operatori a livello bit proprio non li digerisco.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Bella anche questa, ma c'è un piccolo errore in caso di stringhe di lunghezza pari.
    Il while invece

    codice:
     while( i != ii )
    deve diventare

    codice:
     while( i < ii )

  7. #7
    Hai perfettamente ragione

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    47
    Ho letto ora le vostre risposte....vi ringrazio infinitamente...A breve posterò un'altra discussione in cui chiederò delle delucidazioni su un programma di cui c'è stata consegnata una copia risolta ma che nessuno capisce

    A presto, grazie ancora!!!Ciau!!!!


    Edito: Posso chiedere una cosa, perchè allora mi sa che non sapevo una gran bella cosa

    Se te crei due puntatori a s non vai a modificare s giusto???
    quindi quello che tu fai è di creare *i e *ii e poi lavori su loro...così non hai la stringa di appoggio, e poi fai un cambio di carattere utilizzando una variabile char di comodo....giusto??

    Grazie ancora a tutti!!ciauz!

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Beccatevi questa mia personale versione:

    codice:
    void inverti (char *a)
    {
        char *b = a;
        while (*b)
            b++;
        for (; a < --b; a++)
            *a ^= *b ^= *a ^= *b;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  10. #10
    In effetti mettere il --b nel test del ciclo (con il while sarebbe while( i < --ii )) mi è piaciuto

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.