PDA

View Full Version : [C] getchar


-hide-
23-12-2008, 13:43
Ciao ragazzi.
Dovrei far inserire ina stringa che possa contenere anche degli spazi e scanf non credo faccia al caso mio. Per questo avevo pensato alla funzione getchar () che prende i caratteri uno alla volta.


for (i=0;((ch=getchar()) != '\n') && (i<20); i++)
n[i] = ch;
n[i] = '\0';


Le variabili sono già state definite prima.
Questo codice dovrebbe prendere ogni carattere inserito da input finché non trova l'accapo identificato da \n. Poi uscito dal ciclo for si deve chiudere la stringa mettendo un \0 di chiusura.
Solo che probabilmente in esecuzione non entra neanche nel ciclo.
Che mi dite?!

cionci
23-12-2008, 15:41
gets dovrebbe fare al caso tuo

-hide-
23-12-2008, 16:09
Non ho mai utilizzato la funzione gets.
Come si usa?

cionci
23-12-2008, 16:11
http://www.cplusplus.com/reference/clibrary/cstdio/gets.html

In ogni caso molto meglio utilizzare la fgets mettendo al posto del puntatore a file stdin: http://www.cplusplus.com/reference/clibrary/cstdio/fgets.html

char buffer[101];
fgets(buffer, 100, stdin);

-hide-
24-12-2008, 13:32
Niente. Ho usato getchar, getc, gets, fgets. Non riesco a far funzionare questa istruzione ed ormai dopo due giorni sono entrato nel baldassone e sto uscendo pazzo.

Posto il codice. Se qualcuno di buona volontà ha la voglia di modificare la parte che mi serve in modo tale da farmi vedere dove sbaglio, ne sarei contento.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ELEM 100
#define NCHAR 20

// Definizione della struttura
typedef struct {
char nome[NCHAR];
char cognome[NCHAR];
char telefono[NCHAR];
char citta[NCHAR];
} account;

// Variabili globali
account rubrica[ELEM];
int num_account = 0;

// Dichiarazione delle funzioni
void InsContatto (char nom[], char cogn[], char tel[], char cit[]);
void ModContatto (char nom[], char cogn[]);
void Cancella (char nom[], char cogn[]);
void Visualizza (char nom[], char cogn[]);

int main()
{ //OPEN main
short int scelta, i; /* per inserire la scelta del men˘ */
char n[NCHAR]; /* per inserire il nome */
char m[NCHAR]; /* per inserire il cognome */
char c[NCHAR]; /* per inserire la citt‡ */
char t[NCHAR]; /* per inserire il numero di telefono */
char ch = '\0';
for (;scelta!= 0;)
{ //OPEN for
printf ("\nLorenzo Carnevale\n");
printf ("Rubrica V 1.0\n\n");
printf ("\t\t INDEX\n");
printf ("\t***************************\n");
printf ("\t* 1 - Inserisci Contatto *\n");
printf ("\t* 2 - Modifica Contatto *\n");
printf ("\t* 3 - Cancella Contatto *\n");
printf ("\t* 4 - Visualizza Contatto *\n");
printf ("\t* *\n");
printf ("\t* 0 - Esci dal programma *\n");
printf ("\t***************************\n\n");
printf ("Digita: ");
scanf ("%hd", &scelta);
switch (scelta)
{ //OPEN switch
case 0: // Exit
printf ("\n\t\tGrazie per la scelta\n\n");
break;
case 1: // Inserisci contatto
printf ("\nNome: ");
for (i=0;(i<20) && ((ch=getchar())!='\n');i++)
if (ch != '\b') n[i] = ch;
n[i] = '\0';
printf ("Cognome: ");
scanf ("%s", m);
printf ("Telefono: ");
scanf ("%s", t);
printf ("Citta': ");
scanf ("%s", c);
printf ("\n");
InsContatto(n,m,t,c);
break;
case 2: // Modifica Contatto
printf ("\nNome: ");
scanf ("%s", n);
printf ("Cognome: ");
scanf ("%s", m);
ModContatto (n,m);
break;
case 3: // Cancella
printf ("\nNome: ");
scanf ("%s", n);
printf ("Cognome: ");
scanf ("%s", m);
Cancella (n,m);
break;
case 4: // Visualizza
printf ("\nNome: ");
scanf ("%s", n);
printf ("Cognome: ");
scanf ("%s", m);
Visualizza (n,m);
break;
} //CLOSED switch
} //CLOSED for
return 0;
} //CLOSED main

// Definizione delle funzioni
void InsContatto (char nom[], char cogn[], char tel[], char cit[])
{ //OPEN InsContatto
int i;
if (num_account == ELEM)
{ //OPEN if
printf ("Hai raggiunto il limite di contatti offerto\n\n");
return;
} //CLOSED if
for (i=0; i<=num_account; i++)
{ //OPEN for
if ((strcmp (nom,rubrica[i].nome)==0) && (strcmp (cogn,rubrica[i].cognome)==0))
{ //OPEN if
printf ("Nome e Cognome utente esistono in memoria\n\n");
return;
} //CLOSED if
} //CLOSED for
strcpy (rubrica[num_account].nome,nom);
strcpy (rubrica[num_account].cognome,cogn);
strcpy (rubrica[num_account].telefono,tel);
strcpy (rubrica[num_account].citta,cit);
num_account++;
return;
} //CLOSED InsContatto

void ModContatto (char nom[], char cogn[])
{ //OPEN ModContatto
int i;
for (i=0; i<=num_account; i++)
{ //OPEN for
if ((strcmp (nom,rubrica[i].nome)!=0) && (strcmp (cogn,rubrica[i].cognome)!=0))
{ //OPEN if
printf ("Il contatto non esiste");
printf ("\n\n");
return;
} //CLOSED if
else
{ //OPEN else
printf("Nuovo Nome: ");
scanf("%s", rubrica[i].nome);
printf("Nuovo Cognome: ");
scanf("%s", rubrica[i].cognome);
printf("Nuovo Telefono: ");
scanf("%s", rubrica[i].telefono);
printf("Nuova Citta': ");
scanf("%s", rubrica[i].citta);
return;
} //CLOSED else
} //CLOSED for
} //CLOSED ModContatto

void Cancella (char nom[], char cogn[])
{ //OPEN cancella
int i;
for (i=0; i<=num_account; i++)
{ //OPEN for
if ((strcmp (nom,rubrica[i].nome)!=0) && (strcmp (cogn,rubrica[i].cognome)!=0))
{ //OPEN if
printf ("Il contatto non esiste");
printf ("\n\n");
return;
} //CLOSED if
else
{ //OPEN else
rubrica[i].nome[0] ='\0';
rubrica[i].cognome[0] ='\0';
rubrica[i].telefono[0] ='\0';
rubrica[i].citta[0] ='\0';
return;
} //CLOSED else
} //CLOSED for
} //CLOSED Cancella

void Visualizza (char nom[], char cogn[])
{ //OPEN Visualizza
int i;
for (i=0; i<=num_account; i++)
{ //OPEN for
if ((strcmp (nom,rubrica[i].nome)==0) && (strcmp (cogn,rubrica[i].cognome)==0))
{ //OPEN if
printf ("Il contatto scelto e': \n");
printf ("\n%s %s\n", rubrica[i].nome, rubrica[i].cognome);
printf ("%s\n%s", rubrica[i].telefono, rubrica[i].citta);
printf ("\n\n");
return;
} //CLOSED if
else
{ //OPEN else
printf ("Il contatto non esiste");
printf ("\n\n");
return;
} //CLOSED else
} //CLOSED for
} //CLOSED Visualizza


Il ciclo getchar è solo nella prima istruzione possibile, le altre non le ho modificate.

cionci
24-12-2008, 14:08
A questo:

for (i=0;(i<20) && ((ch=getchar())!='\n');i++)
if (ch != '\b') n[i] = ch;
n[i] = '\0';

sostituisci questo:

fgets(n, NCHAR - 1, stdin);
if(n[strlen(n) - 1] == '\n') n[strlen(n) - 1] = '\0';

Vincenzo1968
24-12-2008, 15:09
A questo:

for (i=0;(i<20) && ((ch=getchar())!='\n');i++)
if (ch != '\b') n[i] = ch;
n[i] = '\0';

sostituisci questo:

fgets(n, NCHAR - 1, stdin);
if(n[strlen(n) - 1] == '\n') n[strlen(n) - 1] = '\0';

Mbè?
E il tag code non si usa più? :O

:bimbo:

cionci
24-12-2008, 15:27
Ho anche sbagliato, bisogna mettere NCHAR al posto di NCHAR - 1 perché fgets legge solo fino al numero passato -1 ;)

-hide-
26-12-2008, 13:05
Scusa il ritardo, ma causa feste non ho avuto molto tempo.
Comunque non funziona neanche così. L'istruzione dove ho inserito quel codice viene saltata.

cionci
26-12-2008, 13:14
Viene saltata perché ti rimane uno \n nello stdin da parte della scanf.

Dopo ogni scanf metti:

while(getchar() != '\n');

permette di svuotare il buffer di stdin dagli \n (in particolare dopo la scanf prima del menu).

-hide-
01-01-2009, 14:17
Ti ringrazio. Ora a prima guardata sembra funzionare. Vado avanti a sostituirlo a tutti quelli che mi servono e poi vediamo come finisce.

Ma strlen cosa fa?

agente mm8
01-01-2009, 16:29
Ritorna il numero di caratteri del puntatore char (stringa) passatogli.