Newsgroup: it.comp.lang.c
Titolo: getchar maledetta???

Salve a tutti...ho un problema...
ho cercato di costruire un calendario che memorizzi appuntamenti in un file 
calendario.txt
nella forma          "  gg/mm/aaaa  ore:min  descrizione  "
e con il seguente schema:(pseudocodice)
struct appuntamento ={struct data={giorno, mese,anno}, struct 
ora={ore,minuti}, char descrizione[100] }
Durante l'esecuzione nella funzione che mi crea un nuovo 
appuntamento(appuntamento nuovoap() ) non riesco a far funzionare 
correttamanete la getchar() che inserirebbe la stringa descrizione(con un 
ciclo) nell'adeguato membro all'interno della struttura.
Scrivendo while(c=getchar()!='\n') oppure  while(c=getchar()!=EOF) ottengo 
che in un caso l'appuntamento viene salvato sul file,ma prima che venga 
inserita la descrizione, dato che si ha una terminazione improvvisa del 
programma, subito dopo la stampa printf("evento: "); nell'altro  caso  si da 
la possibilità all'utente di inserire l'evento ma non avviene il salvataggio 
su file...
uso gcc sotto linux(preferito)  e lcc sotto windows xp
mando il codice nella speranza che sia più esplicativo... le parti 
commentate per ora non mi interessano...!
sotto SONO 3 FILE: appuntamento1.c ,header.h e main.c incolonnati, c'è il 
nome del file prima che cominci
che dire...grazie a tutti in anticipo!
/*file  appuntamento1.c*/
#include "header.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define  INIZIO 2006
#define V 1
#define F 0
//CONTROLLI COMMENTATI PER PROVA SCRITTURA SU FILE
//int is_leap(int anno)/*controlla se l'anno passatogli e' bisestile(return 
1) o meno(return 0)*/
//{
//if((anno%4 == 0 && anno%100!=0)|| anno%400 ==0)
// return V;/*l'anno e' bisestile*/
//else return F;
//}/*end is_leap()*/
//int is_data(int g, int m, int a) /*controlla se i parametri immessi sono 
validi per la data */
//{
// printf("***is_data()***");
// if(a<INIZIO)
// {
// printf("anno gia' trascorso");
// return F;
// }
// else
// switch(m)
// {/*switch-open*/
//case 1: case 3: case 5: case 7: case 8: case 10: case 12:
// {/*1open*/
// if(g<0 || g>31)
// {
// printf("il mese %d ha 31 giorni, inserire un numero da 1 a 31.",m);
// return F;
// }
// else return V;
// break;
// }/*1close*/
//
//case 4: case 6: case 9: case 11:
// {/*4open*/
// if(g<0 || g>30)
// {
// printf("il mese %d ha 30 giorni, inserire un numero da 1 a 30.",m);
// return F;
// }
// else return V;
// break;
// }/*4close*/
//
//case 2: /*febbraio*/
// {/*2open*/
// if(is_leap(a))
// {
// if(g<0 || g>29)
// {
// printf("L'anno %d e' bisestile, dunque febbraio ha 29 giorni.",a);
// return F;
// }
// else return V;
// }
// else
// if(g<0 || g>28)
// {
// printf("L'anno %d non e' bisestile, dunque febbraio ha 28 giorni.",a);
// return 0;
// }
// else
// return V;
// break;
// }/*2close*/
// }/*end switch-case*/
// return F;
//}/*end is_data()*///*******************
//int is_ora(int h, int m) /*controlla se i parametri immessi sono validi 
per l' ora */
//{
// if(h<0 || h>23)
// return F;
// else if(m<0 || m>59) return F;
// else return V;
//}/*end is_ora()*/
data nuovadt() /*crea la nuova data */
{
int g = 0;
int m = 0;
int a = 0;
data d;
//data newdt;
// do
// {
printf("\n***nuovadt()***\n");
printf("Inserire il giorno(1-31): ");
scanf("%d", &g);
printf("\n");
printf("Inserire il mese(1-12): ");
scanf("%d", &m);
printf("\n");
printf("Inserire l' anno(2006...->): ");
scanf("%d", &a);
// }
// while(is_data(g,m,a)!=01);
d.g = (int)g;
d.a = (int)a;
d.m = (int)m;
return d;
}/*end nuovadt()*/
ora nuovaor() /*crea la nuova ora */
{
int h = 0;
int m = 0;
ora o;
// do
// {
printf("\n***nuovaor()***\n");
printf("Inserire le ore(0-23): ");
scanf("%d",&h);
printf("\n");
printf("Inserire i minuti(0-59): ");
scanf("%d",&m);
// }
// while(is_ora(h,m)!=0);
o.h = h;
o.m = m;
return o;
}/*end nuovaor()*/
void salvaSuFile(appuntamento app)
{
//char str[MAX];
FILE *p;
if((p  = fopen("Calendario.txt", "a+")) == NULL)
{
printf("Impossibile aprire il file");
exit(1);
}
data da = app.d;
ora or = app.o;
//str = app.des;
fprintf(p, "%d/%d/%d %d:%d %s\n",da.g,da.m,da.a,or.h,or.m,app.des);
printf("memorizzato!");
fflush(p);
fclose(p);
}/*end salvaSuFile()*/
appuntamento nuovoap() /*crea il nuovo appuntamento*/
{
char dest[MAX];
char c;
int i = 0;
data dat;
ora or;
appuntamento newap;
printf("\n***nuovoap()***\n");
dat = nuovadt();
or = nuovaor();
newap.o = or;
newap.d = dat;
printf("Evento: "); /*...........*/
while((c = getchar()) != '\n')
{
dest[i] = c;
i++;
}
dest[i]='\0';
strcpy(newap.des, dest);
return newap;
}/*end nuovoap*/
**************************
/*file header.h */
#include <stdio.h>
#define MAX 100
#define STR 15
/*STRUTTURE*/
typedef struct
{
int g;
int m;
int a; /*DATA*/
}data;
typedef struct
{
int h;
int m; /*ORA*/
}ora;
typedef struct
{
data d;
ora o; /*APPUNTAMENTO*/
char des[MAX];
}appuntamento;
/*PROTOTIPI DI FUNZIONE*/
/*DI CONTROLLO*/
int is_leap(int anno); /*bisestilita'*/
int is_data(int g, int m, int a);
int is_ora(int h, int m);
/*UTILITA'*/
appuntamento nuovoap();
data nuovadt();
ora nuovaor();
//char *dataToString();
//char *appToString();
void  salvaSuFile(appuntamento app);
********************
/*file main.c */
#include <stdio.h>
#include "header.h"
int main() /*---MAIN---*/
{
printf("***main***");
appuntamento pippo;
pippo = nuovoap();
salvaSuFile(pippo);
return 0;
}/*end main*/
*********************************************

Salve a tutti...ho un problema...[...]
Dimentica dell'esistenza di scanf().  Usa fgets()+sscanf() e vivi
tranquillo.