PDA

Visualizza la versione completa : [C] Uso di "continue"


cles
30-11-2010, 16:36
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



#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;
}

MdE2005
30-11-2010, 18:33
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 :)

cles
30-11-2010, 20:06
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.

MdE2005
30-11-2010, 20:39
Allora potresti stravolgere il codice così:


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 :)

cles
01-12-2010, 07:51
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".


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 :)


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

grazie comunque.
ciao

MdE2005
01-12-2010, 08:34
Fai come vuoi, a me funzionava perfettamente; forse allora non avevo capito cosa chiedevi comunque va bene così.


Ciao :)

Loading