Esercizio sulle strutture in C

di Anonimizzato13903 il
24 risposte

24 Risposte - Pagina 2

  • TheJuniorProgrammer ha scritto:


    Mi potresti spiegare che cos' è il buffer?
    E' uno spazio di memoria in cui sono conservati i tasti che vengono premuti. Se non lo svuoti dopo la scanf quello che c'è viene interpretato come dato per la prossima funzioni di input.
    E perche' non ci sta il titolo di "le colline hanno gli occhi" in una stringa di 20 ?
    Scusa, hai contato i caratteri di quel titolo??
  • Salve a tutti! Purtroppo ho di nuovo un problema stavolta con il case 2:, purtroppo mi salta le istruzioni da eseguire nei due for del case in un modo analogo al problema che avevo nel case 1. Come posso fare per risolvere questo problema?

    Ecco il codice:
    
    
    #include <string.h>
    #include <stdio.h>
    
    int main()
    {
    
    struct{
    
        char titolo[60],data[60],ora[60],canale[60],trasm[60];
    
    
        int durata;
    
    }film[100];
    
    
    int i,n=0,scelta;
    
    printf("\n***Programma di gestione per cinecircolo***\n");
    
    do{
    
            printf("\n1:Inserimento film\n2:Aggiornamento film\n3:Film gia' trasmessi\n4:Film trasmessi in una certa data\n5:Film che verrano trasmessi su un certo canale\n6:I 4 film piu' lunghi\n7:FINE");
    
    
            printf("\n\nFornisci scelta:\n");
            scanf("%d",&scelta);
            while(getchar()!='\n');
    
    switch(scelta)
    {
    
    
    case 1:
    {
    
    if(n<100)
    {
    
    
    printf("\nFornisci dati(titolo,durata,data,ora,trasm,canale)\n");
    
    fgets(film[n].titolo,60,stdin);
    
    scanf("%d",&film[n].durata);
    
    while(getchar()!='\n');
    
    fgets(film[n].data,60,stdin);
    
    fgets(film[n].ora,60,stdin);
    
    fgets(film[n].trasm,60,stdin);
    
    fgets(film[n].canale,60,stdin);
    n++;
    }
    else
    printf("\nSpazio esaurito\n");
    
    }break;
    
    case 2:
    
        {
            char titolo1[60];
         char scelta1[20];
         char data1[20];
        printf("\nVuoi ricercare per data o per titolo il film da aggiornare?\n");
        scanf("%s",scelta1);
    
    if(strcmp(scelta1,"data")==0)
    
    {
    
        printf("\nFornisci la data del film:\n");
    
    scanf("%s",data1);
    
    
    
    
    
     for(i=0;i<1;i++)
    
     {
    
    
    
    
    
        if(strcmp(data1,film[n].data)==0)
     {
         printf("Fornire la nuova situazione di trasmissione(si o no):");
         scanf("%s",film[n].trasm);
     }
    
     else
        printf("\nLa data non trova riscontri nei nostri database, ripetere la scelta e provare un'altra data\n");
    
     }
    }
    
    
    
    
    
    else if(strcmp(scelta1,"titolo")==0)
    
    {
       printf("\nFornisci il titolo del film:\n");
    scanf("%s",titolo1);
    
    
     for(i=0;i<1;i++)
    
        if(strcmp(titolo1,film[n].titolo)==0)
     {
         printf("Fornire la nuova situazione di trasmissione(si o no):");
         scanf("%s",film[n].trasm);
     }
    
     else
        printf("\nIl titolo non trova riscontri nei nostri database, ripetere la scelta e provare un altro titolo\n");
    }
        }break;
    
    }
    }while(scelta!=7);
    
    return(0);
    }
    
    Scusa oregon, hai ragione che erano più di 20 è che...lasciamo perdere(ho sbagliato grandemente e basta)!
  • Allora non hai imparato ... dopo la scanf metti quella while ...
  • In pratica,quindi ogni volta che C' e' una scandalo dopo di essa è' sempre meglio mettere while(getchar()!='\n') ?
  • TheJuniorProgrammer ha scritto:


    In pratica,quindi ogni volta che C' e' una scandalo dopo di essa è' sempre meglio mettere while(getchar()!='\n') ?
    scandalo ?

    (Sì)
  • Scusami intendevo dire scanf...
  • Una domanda...
    Come mai nel case 1 usi fgets per leggere le stringhe e nel secondo scanf?
  • In realtà' ho sempre utilizzato fino a questo momento sempre e solo la funzione scanf, essa non e' però utilizzabile per acquisire stringhe con spazi perciò' visto chef case 1 dovevo acquisire una stringa con spazi ho usato fgets, nel case 2 invece credo non serva poiche' non devo acquisire stringhe con spazi.Pero' visto che sono ancora agli albori della programmazione se sto' sbagliando ad utilizzare scanf nel case 2 dimmelo poiché' io come ti ripeto non sono ancora per niente abile nella programmazione....
  • Il problema principale della scanf è che non compie alcun controllo sulla dimensione della stringa che vuoi inserire quindi sei teoricamente a rischio buffer overflow, ovvero rischi che la stringa letta sia maggiore del buffer a tua disposizione.

    ( Qui è spiegato sicuramente meglio di ciò che saprei fare io, con tanto di esempi: http://www.gidnetwork.com/b-62.htm )

    Se poi hai la necessità di una funzione che legga sino al primo spazio ( come la scanf) una stringa di max N caratteri, allora devi solo scriverti una funzione che faccia questo lavoro

    Qualcosa del genere dovrebbe funzionare, salvo errori:
    
    #include <stdio.h>
    #include <stdlib.h>
    #define N 60
    
    char *safe_scanf(char *s, int n);
    
    
    int main()
    {
    char s [N+1];
    safe_scanf(s,N+1);
    puts ("Stringa inserita:");
    puts(s);
    return 0;
    }
    
    
    char *safe_scanf(char *s, int n)
    {
    register int c;
    register char *cs;
    cs = s;
    //Leggo con la getchar carattere finché non incontro uno spazio bianco
    // e finche'la dimensione n e' maggiore di 0
    while (--n > 0 && ( c = getchar() ) != ' ')
        // *cs++ sposta il puntatore alla posizione successiva, ma restituisce il contenuto precedente
        if ( ( (*cs++) =  c) == '\n')
            break;
    *cs = '\0';     // Inserisco il terminatore di stringa alla fine di quest'ultima
    return s;
    }
  • Grazie mille per tutto il vostro supporto!
Devi accedere o registrarti per scrivere nel forum
24 risposte