Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] Uso di "continue"

  1. #1
    Utente di HTML.it L'avatar di cles
    Registrato dal
    Mar 2010
    Messaggi
    25

    [c] problema continue

    Ciao a tutti,
    ho un problema con questo codice.
    Dovrei modificare il programma originale, che salva dei promemoria e poi li ordina, per far sì che in caso di data negativa o superiore a 31 scriva errore e vada avanti,le mie modifiche hanno due asterischi di fianco per far capire quali sono.
    Se immetto solo il numero "32" va tutto bene ma se scrivo per esempio "32 cena da Luca" mostra l'output "Enter day and reminder:"di continuo senza fermarsi,dove sbaglio?

    Grazie


    codice:
    #include <stdio.h>
    #include <string.h>
    
    #define MAX_REMIND 50   /* numero massimo di promemoria */
    #define MSG_LEN 60      /* lunghezza massima dei messaggi */
    
    int read_line(char str[], int n);
    
    int main(void)
    {
      char reminders[MAX_REMIND][MSG_LEN+3];
      char day_str[3], msg_str[MSG_LEN+1];
      int day, i, j, num_remind = 0;
    
      for (;; ) {
        if (num_remind == MAX_REMIND) {
          printf("-- No space left --\n");
          break;
        }
    
        printf("Enter day and reminder: ");
        scanf("%2d", &day);
        if (day == 0)
          break;
        else if (day < 0 || day > 31){                   **
    		printf("Errore\n");                  **
    		continue;}                           **
        sprintf(day_str, "%2d", day);
        read_line(msg_str, MSG_LEN);
    
        for (i = 0; i < num_remind; i++)
          if (strcmp(day_str, reminders[i]) < 0)
            break;
        for (j = num_remind; j > i; j--)
          strcpy(reminders[j], reminders[j-1]);
    
        strcpy(reminders[i], day_str);
        strcat(reminders[i], msg_str);
    
        num_remind++;
      }
    
      printf("\nDay Reminder\n");
      for (i = 0; i < num_remind; i++)
        printf(" %s\n", reminders[i]);
    
      return 0;
    }
    
    int read_line(char str[], int n)
    {
      int ch, i = 0;
    
      while ((ch = getchar()) != '\n')
        if (i < n)
          str[i++] = ch;
      str[i] = '\0';
      return i;
    }

  2. #2
    Togli l'istruzione continue e tutto si risolve.

    Ovviamente per coscienza ti devo dire che tutto potrebbe essere riscritto in maniera più semplice e lineare; inoltre per come hai impostato il programma, se un utente inserisce "235" il programma considera solo le prime 2 cifre, quindi 23: forse sarebbe meglio se considerassi errore anche l'inserimento di numeri a numero di cifre > 2 (scusa il giro di parole).


    Ciao

  3. #3
    Utente di HTML.it L'avatar di cles
    Registrato dal
    Mar 2010
    Messaggi
    25
    Per quello che riguarda la scrittura del programma io ho soltanto effettuato le modifiche con l'asterisco,il resto è un codice di un esercizio del libro che stò leggendo da autodidatta e probabilmente più avanti il libro affronterà il problema della semplificazione.
    Se non sbaglio uno degli esercizi successivo è proprio quello di segnalare errore con cifre > 2.

    Se tolgo continue il programma mi elabora comunque il numero,io devo farlo ignorare e inoltre il libro mi dà come suggerimento "utilizzo di continue",quindi suppongo che debba esistere un modo per utilizzarlo.

    Spero che tu mi possa dire come fare.

  4. #4
    Allora potresti stravolgere il codice così:
    codice:
      
     printf("Enter day and reminder: ");
        scanf("%2d", &day);
        if (day > 1 || day <= 31)
        {                   
    		                     
        sprintf(day_str, "%2d", day);
        read_line(msg_str, MSG_LEN);
    
        for (i = 0; i < num_remind; i++)
          if (strcmp(day_str, reminders[i]) < 0)
            break;
        for (j = num_remind; j > i; j--)
          strcpy(reminders[j], reminders[j-1]);
    
        strcpy(reminders[i], day_str);
        strcat(reminders[i], msg_str);
    
        num_remind++;
    
       }
       else printf("Errore\n");                  
    		}
    Controlla te le parentesi, ho fatto solo per farti capire..


    Ciao

  5. #5
    Utente di HTML.it L'avatar di cles
    Registrato dal
    Mar 2010
    Messaggi
    25
    ho provato con qualche piccola modifica ma non funziona lo stesso,non capisco perchè scriva l'output continuamente se scrivo "32 cccc" e non se scrivo solo "32".

    codice:
    printf("Enter day and reminder: ");
        scanf("%2d", &day);
    	if (day == 0)
    		break;
        if (day >= 1 && day <= 31)
        {                   
    		                     
        sprintf(day_str, "%2d", day);
        read_line(msg_str, MSG_LEN);
    
        for (i = 0; i < num_remind; i++)
          if (strcmp(day_str, reminders[i]) < 0)
            break;
        for (j = num_remind; j > i; j--)
          strcpy(reminders[j], reminders[j-1]);
    
        strcpy(reminders[i], day_str);
        strcat(reminders[i], msg_str);
    
        num_remind++;
       }
       else printf("Errore\n");                  
      }

    edit:

    ho riportato il codice come prima(tanto il risultato non cambia) e penso che il problema sia la scanf,ovvero,quando scrivo tra i tanti promemoria "32" il programma funziona,quando scrivo "32 cena ...." il programma stampa l'output continuamente.Quindi saltando gli spazi bianchi quando la scanf viene richiamata riceve "c".
    Non sò se è così ma,nel caso, dovrei trovare il modo di svuotare la memoria da quei caratteri,si può fare?


    edit:
    trovata soluzione

    codice:
    else if (day < 0 || day > 31){
    		printf("Errore\n");
    		while(getchar() != '\n')
    			;
    		continue;}
    grazie comunque.
    ciao

  6. #6
    Fai come vuoi, a me funzionava perfettamente; forse allora non avevo capito cosa chiedevi comunque va bene così.


    Ciao

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 © 2025 vBulletin Solutions, Inc. All rights reserved.