Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - rovesciare una stringa (Esercizio 1.19 di
Forum - C/C++ - rovesciare una stringa (Esercizio 1.19 di "Il Linguaggio C")

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Impronta Geek (Normal User)
Rookie


Messaggi: 36
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 19:16
Lunedì, 20/07/2009
Ciao a tutti,
dopo una bella pausa (meritata :D ) dallo studio del C, ho ripreso a scribacchiare :yup:

Come è logico, mi sono già piantato su uno stupido errorino. In questo caso si tratta dell'esercizio 1.19 da "Il Linguaggio C" che dice:

"Si scriva una funzione reverse(s) che capovolga la stringa s. La si usi poi per scrivere un progamma che capovolga, una per volta, le righe del testo in ingresso"

Il codice che ho prodotto è questo (piuttosto banale, mi sembra :yup: ):
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. /* Fine Librerie */
  3.  
  4. /* Costanti */
  5. #define MAXLINE 1000
  6. #define LONG 80
  7. /* Costanti */
  8.  
  9. /* Funzioni */
  10. int reverse(char s[MAXLINE]);
  11. /* Fine Funzione */
  12.  
  13. main(){
  14.        /* Variabili e Vettori */
  15.        int i, c;
  16.        char line[MAXLINE];
  17.        char longest[MAXLINE];
  18.        /* Fine Variabili e Vettori */
  19.        
  20.        /* Intesazione */
  21.        printf("\nEsercizio 1.19 da  'Il Linguaggio C' di Kernighan & Ritchie by Fabio Smeraldo\n");
  22.        printf("\nQuesto programma legge le righe di testo in input e le capovolge con una funzione reverse(s)\n\n");
  23.        /* Fine Intestazione */
  24.        
  25.        /* Funzione getline */
  26.        while((c=getchar())!=EOF){
  27.        reverse(line);
  28.        }
  29.        /* Fine Funzione getline */
  30.        
  31.        /* Main Conclusione */
  32.        scanf("%d",&i);
  33.        return 0;
  34.        /* Fine Main Conclusione */
  35.        }
  36.  
  37. int reverse(char s[MAXLINE]){
  38.     /* Variabili */
  39.     int c, i;
  40.     i=1;
  41.     /* Fine Variabili */
  42.    
  43.     /* Input della stringa */
  44.     while((c=getchar())!=EOF && c!='\n'){
  45.              s[i]=c;
  46.              ++i;
  47.              }
  48.     if(c=='\n'){
  49.                 s[i]=c;
  50.                 ++i;
  51.                 }
  52.     /* Fine input della stringa */
  53.    
  54.     for(i=i+1; i!=-1; --i){
  55.              printf("%c",s[i]);
  56.              }
  57.    
  58.     /* Getline Conclusione */
  59.     return i;
  60.     /* Fine Getline Conclusione */
  61. }



Il mio problema è che metto in input la parola "ciao", il risultato sullo schermo non è "oaic" ma "oai"... cioè la prima lettera non è stata memorizzata in s[0] .  :grr:

Spero che qualcuno di voi geniacci mi possa aiutare, perciò vi ringrazio in attesa di una risposta :hail:

Ultima modifica effettuata da Impronta Geek il 20/07/2009 alle 19:18
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 19:27
Lunedì, 20/07/2009
Ho dato un'occhiata veloce al codice e non capisco a cosa serva la chiamata alla getchar nel main e perche' passi il vettore line che non e' mai stato riempito prima ...

Subito dopo, usi la getchar nella funzione (che non dovrebbe farlo dato che dovrebbe solamente operare sul vettore passato ...).

PM Quote
Avatar
Impronta Geek (Normal User)
Rookie


Messaggi: 36
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 19:34
Lunedì, 20/07/2009
Intanto grazie per la segnalazione dell'errore ;) Allora getchar() io l'ho levato e funziona  quindi ti ringrazio :rofl: Io passo line[] proprio perchè mi serve s[] vuota :rotfl:

Il codice diventa questo:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. /* Fine Librerie */
  3.  
  4. /* Costanti */
  5. #define MAXLINE 1000
  6. #define LONG 80
  7. /* Costanti */
  8.  
  9. /* Funzioni */
  10. int reverse(char s[MAXLINE]);
  11. /* Fine Funzione */
  12.  
  13. main(){
  14.        /* Variabili e Vettori */
  15.        int i, c;
  16.        char line[MAXLINE];
  17.        char longest[MAXLINE];
  18.        /* Fine Variabili e Vettori */
  19.        
  20.        /* Intesazione */
  21.        printf("\nEsercizio 1.19 da  'Il Linguaggio C' di Kernighan & Ritchie by Fabio Smeraldo\n");
  22.        printf("\nQuesto programma legge le righe di testo in input e seleziona quelle con almeno 15 caratteri mostrando alcuni dati riguardo ad esse.\n\n");
  23.        /* Fine Intestazione */
  24.        
  25.        /* Funzione getline */
  26.        reverse(line);
  27.        /* Fine Funzione getline */
  28.        
  29.        /* Main Conclusione */
  30.        scanf("%d",&i);
  31.        return 0;
  32.        /* Fine Main Conclusione */
  33.        }
  34.  
  35. int reverse(char s[MAXLINE]){
  36.     /* Variabili */
  37.     int c, i;
  38.     i=1;
  39.     /* Fine Variabili */
  40.    
  41.     /* Input della stringa */
  42.     while((c=getchar())!=EOF && c!='\n'){
  43.              s[i]=c;
  44.              ++i;
  45.              }
  46.     if(c=='\n'){
  47.                 s[i]=c;
  48.                 ++i;
  49.                 }
  50.     /* Fine input della stringa */
  51.    
  52.     for(i=i; i!=-1; --i){
  53.              printf("%c",s[i]);
  54.              }
  55.    
  56.     /* Getline Conclusione */
  57.     return i;
  58.     /* Fine Getline Conclusione */
  59. }



Ancora grazie ;) (Mi daresti un parere su come è strutturato il codice?)

Ultima modifica effettuata da Impronta Geek il 20/07/2009 alle 19:35
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 20:47
Lunedì, 20/07/2009
Beh ... secondo me c'e' un errore di fondo.

La funzione 'reverse' deve agire sul vettore, modificando la linea in modo da rovesciarla.
Cosi' come l'hai scritto, la tua intenzione (solo intenzione perche' il codice e' sbagliato) è solo di visualizzare la stringa rovesciata e non di memorizzarla rovesciata.

Inoltre, esegui l'input della stringa all'interno della reverse e questo e' funzionalmente sbagliato dato che la reverse deve lavorare solamente sul vettore dopo che questo e' stato riempito.

Sarebbe piu' giusto avere una funzione di input separata, chiamata nel main prima della reverse. Fra l'altro, la reverse non deve restituire alcun valore, motivo per cui deve essere void e non int.

Per concludere, ci sono variabili e define non utilizzati (da eliminare) ed e' sbagliata l'indicazione dell'inclusione delle librerie (errore comune di chi inizia, molto grave per un professore ... :nono: ). Gli include fanno riferimento a semplici file header e non a librerie. Di queste se ne occupa il linker e non il compilatore.

Ti propongo un codice con le correzioni del caso. Dacci un'occhiata. Non ho appositamente separato l'input della stringa come ti avevo detto perche' dovresti provare a farlo tu. Fai attenzione, riga per riga, alle modifiche.

Codice sorgente - presumibilmente C++

  1. /* Include */
  2. #include <stdio.h>
  3. /* Fine Include */
  4.  
  5. /* Costanti */
  6. #define MAXLINE 1000
  7. /* Fine Costanti */
  8.  
  9. /* Dichiarazione Funzioni */
  10. void reverse(char s[]);
  11. /* Fine Dichiarazione Funzioni */
  12.  
  13. /* La main deve restituire un int */
  14. int main()
  15. {
  16.        /* Variabili e Vettori */
  17.        int i;
  18.        char line[MAXLINE];
  19.        /* Fine Variabili e Vettori */
  20.        
  21.        /* Intestazione */
  22.        printf("\nEsercizio 1.19 da  'Il Linguaggio C' di Kernighan & Ritchie by Fabio Smeraldo\n");
  23.        printf("\nQuesto programma legge le righe di testo in input e seleziona quelle con almeno 15 caratteri mostrando alcuni dati riguardo ad esse.\n\n");
  24.        /* Fine Intestazione */
  25.        
  26.        /* Funzione getline */
  27.        reverse(line);
  28.        /* Fine Funzione getline */
  29.  
  30.        /* Controllo */
  31.        printf("%s\n", line);
  32.        /* Fine controllo */
  33.  
  34.        /* Main Conclusione */
  35.        scanf("%d",&i);
  36.        return 0;
  37.        /* Fine Main Conclusione */
  38. }
  39.  
  40. void reverse(char s[])
  41. {
  42.     /* Variabili */
  43.     int c, i, j;
  44.     char t;
  45.     /* Fine Variabili */
  46.      
  47.     /* Input della stringa */
  48.     /* I vettori iniziano dall'elemento 0 */
  49.     i=0;  
  50.     while(((c=getchar()) != '\n') && i<(MAXLINE-1))
  51.                 s[i++]=c;
  52.  
  53.     /* Una stringa deve essere terminata */
  54.     s[i]='\0';
  55.     /* Fine input della stringa */
  56.  
  57.     /* Inversione */
  58.     for(j=0; j<i/2; j++)
  59.     {
  60.        t=s[j];
  61.        s[j]=s[i-j-1];
  62.        s[i-j-1]=t;
  63.     }
  64.     /* Fine Inversione */
  65.  
  66.     /* Fine Getline */
  67. }


PM Quote
Avatar
Impronta Geek (Normal User)
Rookie


Messaggi: 36
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 20:57
Lunedì, 20/07/2009
Continuo a ringraziarti per le tue risposte, sempre corrette e cordiali ;) Sto notando le modifiche una dopo l'altra e capisco i miei errori (anche se le variabili, i vettori e le costanti inutilizzate sono i rimasugli del codice che ho copiato dall'esercizio 1.18 per non riscrivere tutto [un altro erroe :rotfl: ]).

Domani quando ho un po' di tempo ci lavoro un po' su e te lo riposto

Sempre grazie :rofl: ,
Fabio.

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:16
Lunedì, 20/07/2009
Testo quotato

Postato originariamente da Impronta Geek:

Continuo a ringraziarti per le tue risposte, sempre corrette e cordiali ;)



Non tutti la pensano cosi' ... :)

Mi accontento ... almeno uno ...

(sarà perchè studi su un libro e non tenti, senza capirci nulla, di scrivere uno stupido keylogger o uno scheletro malriuscito di trojan ... appena lo farai, sarò meno cordiale ... :) :)  ;)

A risentirci

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 9:43
Martedì, 21/07/2009
Ciao,

volevo solo fare una precisazione, se stai scrivendo la funzione reverse per fare pratica nell'uso delle stringhe, ok, ma se il rovesciamento della stringa ti serve davvero per un progetto piu' grande, esiste gia' una funzione che lo fa, se non ricordo male si chiama strrev.

Ciao. :k:

Luigi

PM Quote
Avatar
Impronta Geek (Normal User)
Rookie


Messaggi: 36
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 10:23
Martedì, 21/07/2009
La funzione reverse (in effetti si chiama così per la consegna dell'esercizio) l'ho creata sollo per imparare ;) Comunque grazie mille per la segnalazione, quando mi servirà per cose più complesse userò volentieri strrev . :)

PM Quote
Avatar
Impronta Geek (Normal User)
Rookie


Messaggi: 36
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 15:18
Martedì, 21/07/2009
Allora, ho rifatto quasi da capo la funzione reverse(s, i) [ho aggiunto un argomento :heehee: ] probabilmente aggiungendo anche qualche errore :D , anche se in linea di massima penso vada bene.

Questo è il nuovo codice:

Codice sorgente - presumibilmente C++

  1. /* Include */
  2. #include <stdio.h>
  3. /* Fine Include */
  4.  
  5. /* Costanti */
  6. #define MAXLINE 1000
  7. /* Fine Costanti */
  8.  
  9. /* Dichiarazione Funzioni */
  10. void reverse(char s[], int i);
  11. /* Fine Dichiarazione Funzioni */
  12.  
  13. /* Main() */
  14. int main()
  15. {
  16.        /* Variabili e Vettori */
  17.        int i, c, e;
  18.        char line[MAXLINE];
  19.        i=0;
  20.        /* Fine Variabili e Vettori */
  21.        
  22.        /* Intestazione */
  23.        printf("\nEsercizio 1.19 da  'Il Linguaggio C' di Kernighan & Ritchie by Fabio Smeraldo\n");
  24.        printf("\nQuesto programma inverte una stinga in input tramite una funzione reverse(s)\n\n");
  25.        /* Fine Intestazione */
  26.  
  27.        /* Funzione getline */
  28.        while((c=getchar())!='\n'){
  29.                 line[i++]=c;
  30.        }
  31.        line[i]='\0';
  32.        reverse(line, i);
  33.        /* Fine Funzione getline */
  34.  
  35.        /* Stampaggio sullo schermo :D */
  36.        printf("\nEcco la stringa invertita:\n%s\n\n",line);
  37.        /* Fine Stampaggio sullo schermo :D */
  38.          
  39.        /* Main Conclusione */  
  40.        printf("Ciao e Grazie per aver usato il mio programma ;)");
  41.        scanf("%d",&e);
  42.        /* Fine Main Conclusione */
  43. }
  44.  
  45. void reverse(char s[], int i)
  46. {
  47.     /* Variabili */
  48.     int j, e;
  49.     char inv[MAXLINE];
  50.     j=0;
  51.     /* Fine Variabili */
  52.      
  53.     /* Copia Invertita in inv[] */
  54.     for(i=i; s[j]!='\0'; --i){
  55.              inv[i]=s[j];
  56.              j++;
  57.              }
  58.     inv[j]=s[0];
  59.     inv[i]='\n';
  60.     /* Fine Copia Invertita in inv[] */
  61.  
  62.     /* Copia inv[] in s[] */
  63.     for(e=0; inv[e]!='\0'; ++e){
  64.              s[e]=inv[e];
  65.              }
  66.     s[++e]='\0';
  67.     /* Fine Copia inv[] in s[] */
  68. }



Spero di non aver fatto eresie, ma intanto funziona 8-| Aspetto sempre consigli e segnalazioni per migliorare il tutto :hail:

Ultima modifica effettuata da Impronta Geek il 21/07/2009 alle 15:19
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo