PDA

Visualizza la versione completa : [C] stringa con spazi da input


-hidesession-
23-12-2008, 16:42
Ciao ragazzi.
Ho bisogno di prendere una stringa da input e che possa contenere anche spazi. L'usatissimo e standard scanf mi sa che non è utile per questo utilizzo e quindi conviene seguire carattere per carattere. La funzione adatta dovrebbe essere getchar.



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

Questo a mio avviso dovrebbe essere la parte di codide adatta alla scrittura di stringhe con getchar. Ovviamente le variabili sono già state dichiarate prima.
Solo che non funziona. Dopo aver schiacciato invio mi salta molte istruzione successive.
Se è necessari posto tutto il codice.

Stoicenko
23-12-2008, 16:45
secondo me è sbagliata la condizione d'uscita dalla for.. quell "==" e l'and "&&"
ricontrolla la logica

-hidesession-
23-12-2008, 16:52
se scrivo "!=" mi salta proprio l'istruzione in questione e passa a quella successiva.

MItaly
23-12-2008, 19:18
Perché ti complichi la vita quando c'è già la funzione fgets pronta all'uso?

-hidesession-
23-12-2008, 19:35
Ma per usare fgets devo creare ed aprire un file. Se in caso non mi interessa il file?!

XWolverineX
23-12-2008, 20:12
Metti stdin come primo argomento

-hidesession-
24-12-2008, 14:43
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.

Loading