Esercizio sulle strutture in C

di
Anonimizzato13903
il
24 risposte

24 Risposte - Pagina 2

  • Re: Esercizio sulle strutture in C

    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??
  • Re: Esercizio sulle strutture in C

    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)!
  • Re: Esercizio sulle strutture in C

    Allora non hai imparato ... dopo la scanf metti quella while ...
  • Re: Esercizio sulle strutture in C

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

    TheJuniorProgrammer ha scritto:


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

    (Sì)
  • Re: Esercizio sulle strutture in C

    Scusami intendevo dire scanf...
  • Re: Esercizio sulle strutture in C

    Una domanda...
    Come mai nel case 1 usi fgets per leggere le stringhe e nel secondo scanf?
  • Re: Esercizio sulle strutture in C

    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....
  • Re: Esercizio sulle strutture in C

    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;
    }
  • Re: Esercizio sulle strutture in C

    Grazie mille per tutto il vostro supporto!
Devi accedere o registrarti per scrivere nel forum
24 risposte