Problema con gets()

di il
14 risposte

Problema con gets()

Salve a tutti come mai a volte usando la funzione gets() il programma qualche volta me la salta?
io per rimediare a questo inconveniente inserisco due volte gets(),il primo me lo salta ma il secondo no vorrei sapere giusto il motivo ,grazie.

14 Risposte

  • Re: Problema con gets()

    Sono solo due giorni che sto leggendo e provando di C con un pizzico di impegno, il tuo problema mi è capitato con scanf(), ed era dovuto al fatto che l'input precedente lasciava il carattere di invio nel buffer, ho risolto pulendo il buffer:
    
    char invio = '\r';
    
    scanf("%c", &invio); // pulisce il buffer, non serve se si immettono stringhe "%s"
    
    Ho provato con gets(), ma non funziona, aspettiamo una risposta autorevole...
  • Re: Problema con gets()

    Prova a mettere
    
    while(getchar() != EOF && getchar() != '\n' );
    
    prima della gets per pulire il buffer. Ma non ne sono sicuro.
  • Re: Problema con gets()

    Non è utile utilizzare cin.ignore ?
  • Re: Problema con gets()

    NewBie12_ ha scritto:


    Non è utile utilizzare cin.ignore ?
    È una funzione del C++. Immagino però che lui stia programmando in C.
  • Re: Problema con gets()

    Grazie per le risposte, in realtà io ho già risolto semplicemente mettendo in serie due volte gets(); il primo lo salta ma il secondo lo prende al 100%,il programma tuttavia gira bene comunque, quello che volevo sapere era il perché succedeva questo fatto..............
  • Re: Problema con gets()

    giammo ha scritto:


    Grazie per le risposte, in realtà io ho già risolto semplicemente mettendo in serie due volte gets(); il primo lo salta ma il secondo lo prende al 100%,il programma tuttavia gira bene comunque, quello che volevo sapere era il perché succedeva questo fatto..............
    Mi sembra che tutte le risposte diano la colpa al buffer!!
    Sarei curioso di sapere se è vero, non hai postato una riga di codice e non ci hai nenche detto se il gets() che viene saltato, è in coda ad un'altra richiesta di input, che potrebbe lasciare il carattere invio nel buffer...
    Grazie, anche io sto studiando e non mi piaccciono le situazioni irrisolte.
  • Re: Problema con gets()

    Non è una situazione insolita. È un argomento già trattato decine di volte e spiegato altrettante volte. Basta fare una ricerca.
  • Re: Problema con gets()

    A me succede su questo programma che è un archivio per salvare libri, il punto dove mi accade è segnalato con una freccia:

     
    #include <stdio.h>           /* lista libbrerie incluse */
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    #define SIZE 50              /* lunghezza nome titolo autore libri */
    #define LEN 0                /* preprocessore per avviare array */
    struct libro{                /* struttura libbreria*/
    char titolo[SIZE];
    char autore[SIZE];
    char genere[SIZE];
    };
    FILE *fptr;                  /* puntatore salvataggio file */
    int a=0;                     /* variabile numero di libri */
    int i;                       /* variabile per il ciclo for */
    int y;                       /* variabile confronto libri */
    int flag=0;                  /* variabile libri trovati */
    struct libro arr_lib[LEN];   /* array libri*/
    void titolo();               /* lista funzioni per far funzionare programma*/
    void aggiungi_libri();
    void visualizza();
    void cerca_libro();
    void cerca_titolo();
    void cerca_autore();
    void cerca_genere();
    void togli_libro();
    
    int main()
    {
        char scelta;
        while(scelta != '5'){
        system("cls");
        titolo();
        scelta = getch();
        switch(scelta){
    case '1':
        visualizza();
        break;
    case '2':
        aggiungi_libri();
        break;
    case '3':
        cerca_libro();
        break;
    case '4':
        togli_libro();
        break;
        }
        }
        return 0;
    }
    void cerca_genere(){
        system("cls");
        char confronto[SIZE];
        char trovato_t[SIZE];
        char trovato_a[SIZE];
        char trovato_g[SIZE];
        printf("================================================================\n");
        printf("                         RICERCA GENERE      \n");
        printf("================================================================\n\n");
        printf("Inserisci il Genere: ");
        gets(confronto);
        gets(confronto);
        for(i=0;i<a;i++){
            y=strcmp(confronto,arr_lib[i].genere);
        if(y == 0){
            strcpy(trovato_t,arr_lib[i].titolo);
            strcpy(trovato_a,arr_lib[i].autore);
            strcpy(trovato_g,arr_lib[i].genere);
            printf("Genere: %20s  Titolo: %20s  Autore: %20s\n",trovato_g,trovato_t,trovato_a);
            flag=1;
         }
        }
        if(flag == 0){
           printf("\nNessun risultato trovato\n");
        }
        printf("\nPremi un tasto per continuare..");
        getch();
    }
    void cerca_autore(){
        system("cls");
        char confronto[SIZE];
        char trovato_t[SIZE];
        char trovato_a[SIZE];
        char trovato_g[SIZE];
        printf("================================================================\n");
        printf("                         RICERCA AUTORE      \n");
        printf("================================================================\n\n");
        printf("Inserisci il Autore: ");
        gets(confronto);
        gets(confronto);
        for(i=0;i<a;i++){
            y=strcmp(confronto,arr_lib[i].autore);
        if(y == 0){
            strcpy(trovato_t,arr_lib[i].titolo);
            strcpy(trovato_a,arr_lib[i].autore);
            strcpy(trovato_g,arr_lib[i].genere);
            printf("Autore: %20s  Titolo: %20s  Genere: %20s\n",trovato_a,trovato_t,trovato_g);
            flag=1;
         }
        }
        if(flag == 0){
           printf("\nNessun risultato trovato\n");
        }
        printf("\nPremi un tasto per continuare..");
        getch();
    }
    void titolo(){
    printf("================================================================\n");
    printf("                          ARCHIVIO                              \n");
    printf("================================================================\n\n");
    printf("1. Libreria\n");
    printf("2. Aggiungi libro\n");
    printf("3. Cerca libro\n");
    printf("4. Togli libro\n");
    printf("5. Esci\n");
    }
    void aggiungi_libri(){
        system("cls");
        printf("================================================================\n");
        printf("                     AGGIUNGI LIBRI       \n");
        printf("================================================================\n\n");
        printf("Inserisci Titolo: ");
        gets(arr_lib[a].titolo);
        printf("Inserisci Autore: ");
        gets(arr_lib[a].autore);
        printf("Inserisci Genere: ");
        gets(arr_lib[a].genere);
        ++a;
    }
    void visualizza(){
        system("cls");
        printf("================================================================\n");
        printf("%20s  %20s  %20s\n","TITOLO","AUTORE","GENERE");
        printf("================================================================\n\n");
        for(i=0;i<a;i++){
        printf("%20s  %20s  %20s\n",arr_lib[i].titolo,arr_lib[i].autore,arr_lib[i].genere);
        }
        printf("\nSono presenti in archivio %d libri\n",a);
        printf("Premi un tasto per continuare..");
        getch();
    }
    void cerca_libro(){
        system("cls");
        int scelta;
        printf("================================================================\n");
        printf("                      RICERCA LIBRO       \n");
        printf("================================================================\n\n");
        printf("1. Cerca per Titolo\n2. Cerca per Autore\n3. Cerca per genere\n4. Esci\n");
        scanf("%d",&scelta);
        switch(scelta){
            case 1:
                cerca_titolo();
                break;
            case 2:
                cerca_autore();
                break;
            case 3:
                cerca_genere();
                break;
            case 4:
                break;
         }
    }
    void cerca_titolo(){
        system("cls");
        char confronto[SIZE];
        char trovato_t[SIZE];
        char trovato_a[SIZE];
        char trovato_g[SIZE];
        printf("================================================================\n");
        printf("                        RICERCA TITOLO      \n");
        printf("================================================================\n\n");
        printf("Inserisci il Titolo: ");
        gets(confronto);
        gets(confronto);      <--------------------- QUESTO è IL PUNTO DOVE MI SUCCEDE
        for(i=0;i<a;i++){
            y=strcmp(confronto,arr_lib[i].titolo);
        if(y == 0){
            strcpy(trovato_t,arr_lib[i].titolo);
            strcpy(trovato_a,arr_lib[i].autore);
            strcpy(trovato_g,arr_lib[i].genere);
            flag=1;
         }
        }
        if(flag == 1){
           system("cls");
           printf("================================================================\n");
           printf("%20s  %20s  %20s\n","TITOLO","AUTORE","GENERE");
           printf("================================================================\n\n");
           printf("\nTitolo: %s    Autore: %s    Genere: %s\n",trovato_t,trovato_a,trovato_g);
        }
        else{
            printf("\nNessun risultato trovato\n");
        }
        printf("\nPremi un tasto per continuare..");
        getch();
    }
    void togli_libro(){
        system("cls");
        int k,flag2=0;
        char confronto[SIZE];
        printf("================================================================\n");
        printf("                         ELIMINA LIBRO      \n");
        printf("================================================================\n\n");
        printf("Inserisci Titolo: ");
        gets(confronto);
        for(i=0;i<a;i++){
                y=strcmp(confronto,arr_lib[i].titolo);
                if( y == 0){
                        for(k=i;k<a-1;k++){
                            strcpy(arr_lib[k].titolo,arr_lib[k+1].titolo);
                            strcpy(arr_lib[k].autore,arr_lib[k+1].autore);
                            strcpy(arr_lib[k].genere,arr_lib[k+1].genere);
                        }
                    printf("\nEliminato!");
                    flag2 = 1;
                    --a;
                }
        }
        if(flag2 == 0){
            printf("\nNessun libro trovato!");
        }
        printf("\nPremi un tasto per continuare..");
        getch();
    }
    
  • Re: Problema con gets()

    Il problema era il buffer, ho corretto il sitema di input scelta precedente, ora i doppi gets() non servono più, ma non credo fossero un errore, semmai un sistema per pulire il buffer.
    Ricorda che è il terzo giorno che traffico con il C, le mie risposte non sono autorevoli.
    
    #include <stdio.h>           /* lista libbrerie incluse */
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    #define SIZE 50              /* lunghezza nome titolo autore libri */
    #define LEN 0                /* preprocessore per avviare array */
    struct libro{                /* struttura libbreria*/
    char titolo[SIZE];
    char autore[SIZE];
    char genere[SIZE];
    };
    FILE *fptr;                  /* puntatore salvataggio file */
    int a=0;                     /* variabile numero di libri */
    int i;                       /* variabile per il ciclo for */
    int y;                       /* variabile confronto libri */
    int flag=0;                  /* variabile libri trovati */
    struct libro arr_lib[LEN];   /* array libri*/
    void titolo();               /* lista funzioni per far funzionare programma*/
    void aggiungi_libri();
    void visualizza();
    void cerca_libro();
    void cerca_titolo();
    void cerca_autore();
    void cerca_genere();
    void togli_libro();
    
    int main()
    {
        char scelta;
        while(scelta != '5'){
        system("cls");
        titolo();
        scelta = getch();
        switch(scelta){
    case '1':
        visualizza();
        break;
    case '2':
        aggiungi_libri();
        break;
    case '3':
        cerca_libro();
        break;
    case '4':
        togli_libro();
        break;
        }
        }
        return 0;
    }
    void cerca_genere(){
        system("cls");
        char confronto[SIZE];
        char trovato_t[SIZE];
        char trovato_a[SIZE];
        char trovato_g[SIZE];
        printf("================================================================\n");
        printf("                         RICERCA GENERE      \n");
        printf("================================================================\n\n");
        printf("Inserisci il Genere: ");
        gets(confronto);
        for(i=0;i<a;i++){
            y=strcmp(confronto,arr_lib[i].genere);
        if(y == 0){
            strcpy(trovato_t,arr_lib[i].titolo);
            strcpy(trovato_a,arr_lib[i].autore);
            strcpy(trovato_g,arr_lib[i].genere);
            printf("Genere: %20s  Titolo: %20s  Autore: %20s\n",trovato_g,trovato_t,trovato_a);
            flag=1;
         }
        }
        if(flag == 0){
           printf("\nNessun risultato trovato\n");
        }
        printf("\nPremi un tasto per continuare..");
        getch();
    }
    void cerca_autore(){
        system("cls");
        char confronto[SIZE];
        char trovato_t[SIZE];
        char trovato_a[SIZE];
        char trovato_g[SIZE];
        printf("================================================================\n");
        printf("                         RICERCA AUTORE      \n");
        printf("================================================================\n\n");
        printf("Inserisci il Autore: ");
        gets(confronto);
        for(i=0;i<a;i++){
            y=strcmp(confronto,arr_lib[i].autore);
        if(y == 0){
            strcpy(trovato_t,arr_lib[i].titolo);
            strcpy(trovato_a,arr_lib[i].autore);
            strcpy(trovato_g,arr_lib[i].genere);
            printf("Autore: %20s  Titolo: %20s  Genere: %20s\n",trovato_a,trovato_t,trovato_g);
            flag=1;
         }
        }
        if(flag == 0){
           printf("\nNessun risultato trovato\n");
        }
        printf("\nPremi un tasto per continuare..");
        getch();
    }
    void titolo(){
    printf("================================================================\n");
    printf("                          ARCHIVIO                              \n");
    printf("================================================================\n\n");
    printf("1. Libreria\n");
    printf("2. Aggiungi libro\n");
    printf("3. Cerca libro\n");
    printf("4. Togli libro\n");
    printf("5. Esci\n");
    }
    void aggiungi_libri(){
        system("cls");
        printf("================================================================\n");
        printf("                     AGGIUNGI LIBRI       \n");
        printf("================================================================\n\n");
        printf("Inserisci Titolo: ");
        gets(arr_lib[a].titolo);
        printf("Inserisci Autore: ");
        gets(arr_lib[a].autore);
        printf("Inserisci Genere: ");
        gets(arr_lib[a].genere);
        ++a;
    }
    void visualizza(){
        system("cls");
        printf("================================================================\n");
        printf("%20s  %20s  %20s\n","TITOLO","AUTORE","GENERE");
        printf("================================================================\n\n");
        for(i=0;i<a;i++){
        printf("%20s  %20s  %20s\n",arr_lib[i].titolo,arr_lib[i].autore,arr_lib[i].genere);
        }
        printf("\nSono presenti in archivio %d libri\n",a);
        printf("Premi un tasto per continuare..");
        getch();
    }
    void cerca_libro(){
        system("cls");
        char scelta;
        printf("================================================================\n");
        printf("                      RICERCA LIBRO       \n");
        printf("================================================================\n\n");
        printf("1. Cerca per Titolo\n2. Cerca per Autore\n3. Cerca per genere\n4. Esci\n");
        scelta = getch();
        switch(scelta){
            case '1':
                cerca_titolo();
                break;
            case '2':
                cerca_autore();
                break;
            case '3':
                cerca_genere();
                break;
            case '4':
                break;
         }
    }
    void cerca_titolo(){
        system("cls");
        char confronto[SIZE];
        char trovato_t[SIZE];
        char trovato_a[SIZE];
        char trovato_g[SIZE];
        printf("================================================================\n");
        printf("                        RICERCA TITOLO      \n");
        printf("================================================================\n\n");
        printf("Inserisci il Titolo: ");
        gets(confronto);
        for(i=0;i<a;i++){
            y=strcmp(confronto,arr_lib[i].titolo);
        if(y == 0){
            strcpy(trovato_t,arr_lib[i].titolo);
            strcpy(trovato_a,arr_lib[i].autore);
            strcpy(trovato_g,arr_lib[i].genere);
            flag=1;
         }
        }
        if(flag == 1){
           system("cls");
           printf("================================================================\n");
           printf("%20s  %20s  %20s\n","TITOLO","AUTORE","GENERE");
           printf("================================================================\n\n");
           printf("\nTitolo: %s    Autore: %s    Genere: %s\n",trovato_t,trovato_a,trovato_g);
        }
        else{
            printf("\nNessun risultato trovato\n");
        }
        printf("\nPremi un tasto per continuare..");
        getch();
    }
    void togli_libro(){
        system("cls");
        int k,flag2=0;
        char confronto[SIZE];
        printf("================================================================\n");
        printf("                         ELIMINA LIBRO      \n");
        printf("================================================================\n\n");
        printf("Inserisci Titolo: ");
        gets(confronto);
        for(i=0;i<a;i++){
                y=strcmp(confronto,arr_lib[i].titolo);
                if( y == 0){
                        for(k=i;k<a-1;k++){
                            strcpy(arr_lib[k].titolo,arr_lib[k+1].titolo);
                            strcpy(arr_lib[k].autore,arr_lib[k+1].autore);
                            strcpy(arr_lib[k].genere,arr_lib[k+1].genere);
                        }
                    printf("\nEliminato!");
                    flag2 = 1;
                    --a;
                }
        }
        if(flag2 == 0){
            printf("\nNessun libro trovato!");
        }
        printf("\nPremi un tasto per continuare..");
        getch();
    }
  • Re: Problema con gets()

    
    #define LEN 0                /* preprocessore per avviare array */
    struct libro arr_lib[LEN];   /* array libri*/
    
    Sicuri sicuri di aver studiato bene gli array?
  • Re: Problema con gets()

    Allora diciamo che devo migliorare, ma intendi il fatto che ho messo LEN 0 ? c'è un motivo se lo fatto ma sicuramente non è il sistema migliore.....
  • Re: Problema con gets()

    Non è il migliore ma non è nemmeno un sistema corretto. Secondo te si può allargare un array semplicemente incrementando un indice (a), che non c'entra nulla con quell'array, dopo che sei andato a scrivere su un'area di memoria che prima dell'incremento si trova fuori dall'array?

    Prova a dichiarare a dopo arr_lib e vedi che succede
  • Re: Problema con gets()

    Grazie, sono qui per imparare....
  • Re: Problema con gets()

    Va bene fissare un massimo, tipo:
    
    #define LEN 1000 
    
Devi accedere o registrarti per scrivere nel forum
14 risposte