Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Perchè il nome non viene inserito?
Forum - C/C++ - Perchè il nome non viene inserito?

Avatar
Liuk (Normal User)
Rookie


Messaggi: 21
Iscritto: 01/09/2011

Segnala al moderatore
Postato alle 13:25
Giovedì, 01/09/2011
Codice sorgente - presumibilmente C++

  1. /*
  2.         Programma:      cavallin-agenda.c      
  3.         Autore:         Cavallin Luca  
  4.         Classe:         4CINF  
  5.         Data:           30/08/2011     
  6.         Descrizione:    Attività estive
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. #define DIM 100
  14.  
  15. void clear(void);
  16. void pEnter(void);
  17. void setColor(int a, int b, int c);
  18.  
  19.  
  20. struct item
  21. {
  22.     char nome[DIM];
  23.     char cognome[DIM];
  24.     int numero;
  25.     int valido;
  26. };
  27.  
  28. typedef struct item item;
  29.  
  30. void inserisciNominativo(item[], int*);
  31. void cancellaNominativo(item[], int*);
  32. void stampaAgenda(item[], int*);
  33. void ricercaNominativo(item[], int*);
  34.  
  35.  
  36. int main(void)
  37. {
  38.         system("clear");
  39.         item agenda[DIM];
  40.         int *nnom = 0;
  41.         int ch;
  42.         do
  43.         {
  44.                 setColor(1, 0, 32);
  45.                 printf("\n\t\t*****************************************\n");
  46.                 printf("\t\t*                                       *\n");
  47.                 printf("\t\t*           CAVALLIN - AGENDA           *\n");
  48.                 printf("\t\t*                                       *\n");
  49.                 printf("\t\t*****************************************\n\n");
  50.                 printf("\n \t* MENÙ *\n\n");
  51.                 setColor(1, 0, 0);
  52.                 printf(" 1| Inserire nominativo \n");
  53.                 printf(" 2| Cancellare nominativo\n");
  54.                 printf(" 3| Stampa agenda\n");
  55.                 printf(" 4| Ricerca nominativo\n");
  56.                 printf(" 0| Esci\n");
  57.                 printf("\n Inserisci scelta: ");
  58.                 scanf("%d", &ch);
  59.                 system("clear");
  60.                 switch(ch)
  61.                 {
  62.                         case 1:
  63.                                 inserisciNominativo(agenda, &nnom);
  64.                                 pEnter();
  65.                                 break;
  66.                                
  67.                         case 2:
  68.                                 pEnter();
  69.                                 break;
  70.  
  71.                         case 3:
  72.                                 stampaAgenda(agenda, &nnom);
  73.                                 pEnter();
  74.                                 break;
  75.                                
  76.                         case 4:
  77.  
  78.                                 pEnter();
  79.                                 break;
  80.                        
  81.                         case 0:
  82.                                 return 0;
  83.                                 break;
  84.                                
  85.                         default:
  86.                        
  87.                                 break;
  88.                 }
  89.                 clear();
  90.         }
  91.         while(ch != 0);
  92.         return 0;
  93. }
  94.  
  95. void setColor(int a, int b, int c)
  96. {
  97.         printf("\e[%d;%d;%dm", a, b, c);
  98. }
  99.  
  100. void clear(void)
  101. {
  102.     system("clear");
  103. }
  104.  
  105. void pEnter(void)
  106. {
  107.         printf("\n\n Premi INVIO per continuare...\n");
  108.         getchar();
  109. }
  110.  
  111. void inserisciNominativo(item agenda[], int *nnom)
  112. {
  113.     clear();
  114.     int i, ex;
  115.     char tmpNome[DIM], tmpCognome[DIM];
  116.     do
  117.     {
  118.         setColor(1, 0, 32);
  119.         printf("\n Inserimento nominativo\n\n");
  120.         setColor(1, 0 , 1);
  121.         printf(" Nome: ");
  122.         getchar();
  123.         gets(tmpNome);
  124.         printf(" Cognome: ");
  125.         gets(tmpCognome);
  126.         if(*nnom>0)
  127.         {
  128.             for(i=0; i<*nnom; i++)
  129.             {
  130.                 if(strcmp(tmpNome, agenda[i].nome) == 0 && strcmp(tmpCognome, agenda[i].cognome) == 0 && agenda[i].valido == 0)
  131.                 {
  132.                     ex = 1;
  133.                 }
  134.             }
  135.         }
  136.     }
  137.     while(ex=0);
  138.     strcpy(tmpNome, agenda[*nnom].nome);
  139.     strcpy(tmpCognome, agenda[*nnom].cognome);
  140.     printf(" Telefono: ");
  141.     scanf("%d", &agenda[*nnom].numero);
  142.     agenda[*nnom].valido = 0;
  143.     (*nnom)++;
  144.     ex = 0;
  145. }
  146.  
  147. void cancellaNominativo(item agenda[], int *nnom)
  148. {
  149.  
  150. }
  151.                        
  152. void stampaAgenda(item agenda[], int *nnom)
  153. {
  154.     int i;
  155.     clear();
  156.     setColor(1, 0, 32);
  157.     printf("\n Stampa agenda\n\n");
  158.     setColor(1, 0, 1);
  159.     for(i=0; i<*nnom; i++)
  160.     {
  161.         if(agenda[i].valido == 0)
  162.         {
  163.             printf("\n %s\n", agenda[i].nome);
  164.             printf("\n %s\n", agenda[i].cognome);
  165.             printf("\n %d", agenda[i].numero);
  166.         }
  167.     }
  168. }
  169.  
  170. void ricercaNominativo(item agenda[], int *nnom)
  171. {
  172.  
  173. }



Ma da dei problemi nell'inserimento del nome: viene inserito solo il numero..

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 13:39
Giovedì, 01/09/2011
aggiungi fflush(stdin) prima di ogni gets

PM Quote
Avatar
Liuk (Normal User)
Rookie


Messaggi: 21
Iscritto: 01/09/2011

Segnala al moderatore
Postato alle 13:50
Giovedì, 01/09/2011
Sono su Linux :cheer:

PM Quote
Avatar
kopiro91 (Member)
Newbie


Messaggi: 20
Iscritto: 23/07/2008

Segnala al moderatore
Postato alle 14:45
Giovedì, 01/09/2011
E' un problema irrisolvibile.
Cioè, fino ad ora non son riuscito a trovare una soluzione giusta.


Io ricordo che risolsi mettendo due fgets(), una "fittizia" e l'atra prendeva il nome.

PM Quote
Avatar
Liuk (Normal User)
Rookie


Messaggi: 21
Iscritto: 01/09/2011

Segnala al moderatore
Postato alle 15:13
Giovedì, 01/09/2011
Io credo che il problema sia più che altro nella copia dal nome temporaneo alla struct v.v

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:29
Giovedì, 01/09/2011
Testo quotato

Postato originariamente da Liuk:

Sono su Linux :cheer:



e quindi?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:45
Giovedì, 01/09/2011
Qualche riga piu' sopra stai utilizzando scanf. Scanf lascia nel buffer di input il carattere di nuova linea. Questo carattere viene poi letto da fgets (e per questo da l'impressione che la chiamata viene ignorata).

fflush e' un workaround, ma e' sconsigliato: http://www.gidnetwork.com/b-57.html

Usa fgets con consistenza invece di scanf.


Il mio blog: https://piero.dev
PM Quote