|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
[C] getchar
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. Codice:
for (i=0;((ch=getchar()) != '\n') && (i<20); i++) n[i] = ch; n[i] = '\0'; 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?!
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
gets dovrebbe fare al caso tuo
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Non ho mai utilizzato la funzione gets.
Come si usa?
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
http://www.cplusplus.com/reference/c...tdio/gets.html
In ogni caso molto meglio utilizzare la fgets mettendo al posto del puntatore a file stdin: http://www.cplusplus.com/reference/c...dio/fgets.html char buffer[101]; fgets(buffer, 100, stdin); |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
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. Codice:
#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
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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'; Ultima modifica di cionci : 24-12-2008 alle 14:13. |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ho anche sbagliato, bisogna mettere NCHAR al posto di NCHAR - 1 perché fgets legge solo fino al numero passato -1
![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
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.
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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). |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
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?
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Mar 2008
Messaggi: 401
|
Ritorna il numero di caratteri del puntatore char (stringa) passatogli.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:02.