|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
[C++] Piccolo problemino...
ciao a tutti, facendo un programma in c++ ho riscontrato un piccolo problemino,
intanto vi copio parte del codice: Codice:
void aggiungiUser (){
cout<< "Inserire codice \n";
gets(utenti[u].codice);
cout<< "Inserire nome \n";
gets(utenti[u].nome);
cout<< "Inserire cognome \n";
gets(utenti[u].cognome);
cout<< "Inserire email \n";
gets(utenti[u].email);
u++;
}
Codice:
char scelta;
bool g = true;
do {
cout<<"Scegliere un'opzione fra le seguenti: \n";
cout<<"a) Aggiungi utente \n";
cout<<"b) Aggiungi mailing list \n";
cout<<"c) Iscrivi utente a mailing list \n";
cout<<"d) Cancella utente da mailing list \n";
cout<<"e) Stampa elenco iscritti a mailing list \n";
cout<<"f) Elimina mailing list \n";
cout<<"g) Uscire dal programma \n";
cout<<"----------------------------------------- \n\n";
cin>>scelta;
if (scelta == 'a') a:aggiungiUser ();
if (scelta == 'b') b:aggiungiMailingList ();
if (scelta == 'c') c:gestioneIscrizione ();
if (scelta == 'g') g=false;
} while (g);
![]() qualcuno sa illuminarmi su come potrei risolvere? ah se al posto del menu faccio partire direttamente il metodo per aggiungere l'utente mi funziona perfettamente ma così non mi serve..
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Ultimamente c'e' un sacco di gente che posta per questo problema
Praticamente quando digiti "a" e poi premi invio metti nel buffer di input due caratteri: 'a' e il carattere di ritorno a capo. Il primo cin consuma il primo carattere, cioe' 'a'. Il carattere di ritorno a capo resta nel buffer e quindi viene consumato piu' avanti, nella prima gets. Puoi risolvere velocemente aggiungendo un gets a vuoto dopo cin>>scelta; o meglio ancora, ma non sono sicuro che funzioni, facendo un fflush di stdin sempre dopo cin>>scelta; Codice:
fflush(stdin); |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
Quote:
meno male che ho chiesto perchè non conoscendo questo comando non sarei riuscito a risolvere altrimenti.... comunque questo comando serve a "scorrere" lo standard input? dal nome pare faccia qualcosa del genere....
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Ha comportamenti differenti a seconda dell'utilizzo su uno stream di input o su uno di output, nel caso dello stream di input svuota il buffer, ma non sempre, dipende dalle implementazioni, per questo sarebbe meglio usare altri metodi.
In effetti usare gets a vuoto non e' la soluzione migliore sebbene funzioni per input sensati perche' potrebbe essere stata digitata in input una stringa piu' lunga dell'array passato a gets. La soluzione piu' portabile sarebbe consumare l'input carattere per carattere: Codice:
void myFlush(){
c=getchar();
while(c!='\n') c=getchar();
}
Scusa se l'ho scritta in C ma C++ non lo conosco granche'. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
scusate ora mi è venuto un altro dubbio,
praticamente ho queste due classi: Codice:
class User {
public:
char codice [80], nome [80], cognome [80], email [80];
};
class MailingList : public User {
public:
char nomelista [80], creazione [80], iscritti [200];
};
Codice:
class MailingList : public User {
public:
char nomelista [80], creazione [80];
User iscritti [100];
};
per ora nell'altra classe ho: Codice:
class MailServer : public MailingList {
public:
User utenti [5000];
MailingList liste [500];
.
.
cout<< "Inserire gli iscritti \n";
gets (liste[m].iscritti);
Codice:
char tmp [5];
for (int i=0;; i++){
gets (liste[m].iscritti[i].nome);
if (strcmp(liste[m].iscritti[i].nome,tmp)==0) break; //cioè se inserisco un nome continua con il successivo, se invece non inserisco nessun nome esce dal ciclo for (potrebbe funzionare..)
}
edit: dimenticavo, sto cambiando pure perchè in un altro esercizio mi dice di trovare un utente, verificare se è iscritto ad una mailing list e chiedere se si deve cancellare... ma se faccio come avevo fatto inizialmente con il char iscritti [200], non posso confrontare il nome utente con la lista degli iscritti....
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perché usi la gets e non la getline ? Tra l'altro la gets è estremamente propensa al buffer overflow.
http://www.cplusplus.com/reference/i...tream/getline/ http://www.cplusplus.com/reference/string/getline/ |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Per avere una alternativa semplice a fflush(stdin) in C++ basta: string s; getline(cin, s); Ovviamente devi essere sicuro che ci sia almeno un carattere nel buffer di ingresso. Ed almeno un carattere nel buffer rimane, ad esempio, con tutti gli stream usando l'operatore >> (rimane \n). Ad esempio, invece non rimane usando la istream::getline se si raggiunge il numero massimo di caratteri del buffer. |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
Quote:
comunque mi sapete dire come inserire un ritorno a capo in una stringa? praticamente per il secondo problema che ho, quello degli iscritti, ho creato una stringa iscritti [100] dentro un ciclo for, così quando creo una mailing list posso inserire tutti gli iscritti, però dovrei anche mettere che se c'è un ritorno a capo senza nessuna scritta deve chiudere il ciclo for... ho provato con if(liste[m].iscritti[i] == NULL), == "", == " ", == "\n", == "\r\n" ma niente....
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Dipende da come è formata questa stringa.
Stampa i caratteri di questa stringa forzandoli a intero. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
non capisco cosa dovrei fare.. potresti essere più specifico?
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Bisogna capire carattere per carattere come è formata questa stringa.
Perché può essere formata da \r\n, dal solo \n o può essere una stringa vuota. Inoltre mi specifichi il tipo dlela variabile liste[m].iscritti[i] ? |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
per farti capire meglio ti posto l'intero programma (dovrei ancora sostituire tutte le gets con getline):
Codice:
int u=0,m=0;
class User {
public:
char codice [80], nome [80], cognome [80], email [80];
};
class MailingList : public User {
public:
char nomelista [80], creazione [80];
string iscritti [100];
};
class MailServer : public MailingList {
public:
User utenti [5000];
MailingList liste [500];
void aggiungiMailingList (){ //esercizio 1
char tmp [5];
cout<< "Inserire nome della lista \n";
gets(liste[m].nomelista);
cout<< "Inserire data di creazione \n";
gets(liste[m].creazione);
cout<< "Inserire gli iscritti \n";
for (int i=0;;i++){
cin>>liste[m].iscritti[i];
if (liste[m].iscritti[i]=="\n") break;--> la riga che mi dà problemi
}
m++;
cout<< "\n";
}
void aggiungiUser (){ //esercizio 2
cout<< "Inserire codice \n";
gets(utenti[u].codice);
cout<< "Inserire nome \n";
gets(utenti[u].nome);
cout<< "Inserire cognome \n";
gets(utenti[u].cognome);
cout<< "Inserire email \n";
gets(utenti[u].email);
u++;
cout<< "\n";
}
void gestioneIscrizione (){ //esercizio 3
char cod [80],risposta;
bool flag=false;
int j=0;
cout<< "Inserire codice \n";
gets (cod);
for (; j<u; j++){
if (strcmp(cod,utenti[j].codice)==0){
cout<<"Nome "<<utenti[j].nome<<"\n";
cout<<"Cognome "<<utenti[j].cognome<<"\n";
cout<<"Email "<<utenti[j].email<<"\n";
flag = true;
break;
}
}
if (flag == false) cout<< "Utente non trovato.\n\n";
else{
for (int k=0; k<m; k++){
cout<<"Ci si vuole iscrivere alla mailing list " << liste[k].nomelista << " ? s/n\n";
cin>>risposta;
if (risposta == 's') {
for(int i=0;;i++){
if (liste[k].iscritti[i]=="") liste[k].iscritti[i]= utenti[j].nome;
// strcat(liste[k].iscritti, " ");
// strcat(liste[k].iscritti, utenti[j].nome);
}
}
}
}
}
void elencoutenti () { //esercizio 4
char scelta;
for (int i=0; i<m; i++){
cout<<"Stampare l'elenco utenti della mailing list "<<liste[i].nomelista<<" ? s/n\n";
cin>>scelta;
fflush(stdin);
if (scelta == 's'){
cout<<"Utenti iscritti: "<< liste[i].iscritti<<"\n\n";
}
}
}
//void cancellaUtente (){ //esercizio 5
//char cod [40];
//cout<< "Inserire codice \n";
//gets (cod);
//for (int i=0; i<m; i++){
//if (strcmp(cod,utenti[j].codice)==0){
// cout<<"Nome "<<utenti[j].nome<<"\n";
// cout<<"Cognome "<<utenti[j].cognome<<"\n";
// cout<<"Email "<<utenti[j].email<<"\n";
// break;
// }
// }
//
//
//}
void eliminazioneMailingList () { //esercizio 6
char nom [80];
char null [80];
cout<< "Inserire nome mailing list \n";
gets (nom);
for (int i=0; i<m; i++){
if (strcmp(nom,liste[i].nomelista)==0){
m--;
cout<< "Utenti iscritti: "<< liste[i].iscritti<<"\n";
if (liste[i+1].nomelista != NULL){
for (i; i<m; i++){
strcpy(liste[i].nomelista, liste[i+1].nomelista);
strcpy(liste[i].creazione, liste[i+1].creazione);
for(int k=0;;k++){
if (liste[i+1].iscritti[k]== "") break;
liste[i].iscritti[k]= liste[i+1].iscritti[k];
}
}
}
else m--;
}
}
}
void menu (){ // menù
char scelta;
bool g = true;
do {
cout<<"Scegliere un'opzione fra le seguenti: \n";
cout<<"a) Aggiungi utente \n";
cout<<"b) Aggiungi mailing list \n";
cout<<"c) Iscrivi utente a mailing list \n";
cout<<"d) Cancella utente da mailing list \n";
cout<<"e) Stampa elenco iscritti a mailing list \n";
cout<<"f) Elimina mailing list \n";
cout<<"g) Uscire dal programma \n";
cout<<"----------------------------------------- \n\n";
string s;
cin>>scelta;
getline(cin, s);
switch (scelta){
case 'a':
a:aggiungiUser ();
break;
case 'b':
b:aggiungiMailingList ();
break;
case 'c':
c:gestioneIscrizione ();
break;
case 'd':
break;
case 'e':
elencoutenti ();
break;
case 'f':
eliminazioneMailingList ();
break;
case 'g':
g=false;
break;
}
} while (g);
}
};
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
if(liste[m].iscritti[i].compare("\n") == 0)
Il problema però è che bisogna capire da quali caratteri è composta l'ultima stringa. Per saperlo stampa con un for tutti gli elementi dell'ultima stringa: Codice:
for(int i = 0; i < ultimastringa.length(); ++i) cout << (int)ultimastringa[i] << " "; cout << endl; |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
Quote:
sono io ad immettere i dati in liste[m].iscritti[i] con Codice:
for (int i=0;;i++){
cin>>liste[m].iscritti[i];
if (liste[m].iscritti[i]=="\n") break;
}
infatti per farlo funzionare per ora ho messo if (liste[m].iscritti[i]==".") break; così appena metto il punto si chiude il ciclo for e la lista degli iscritti, però per farlo più pulito volevo mettere che quando uno non inserisce nessun nome e preme invio si chiuda la lista degli iscritti..
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non so perché ma ero convinto che leggessi da file
Prova con: if(liste[m].iscritti[i].length() == 0) break; |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
Quote:
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 3609
|
Quote:
funziona con Codice:
getline(cin, liste[m].iscritti[i]); if (liste[m].iscritti[i]=="") break;
__________________
Notebook MSI GT73VR 7RE TITAN SLI: 17.3" 4K IPS @ 120 Hz, i7-7820HK, 2x Nvidia GeForce GTX 1070 (SLI) - 8 GB GDDR5, 2x 16GB DDR4 2.400Mhz, Super Raid 4-512GB NVMe SSD +1TB (SATA) 7200rpm In vendita: |Utenti consigliati|: Marcondiron99 |Utenti sconsigliati|: iltoffa, otherman |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:32.





















