PDA

View Full Version : [C++] Inserire spazi nelle stringhe senza che salti al cin successivo


Markycap
23-06-2008, 19:21
Buonasera.

Vorrei sapere se esiste un metodo per inserire spazi nelle stringhe senza che crashi il programma. Esempio.

char nome[20];
cin >> nome;

Se inserisco come input "Giacomo Rossi", spazio incluso, si impalla il programma.

Non voglio eliminare gli spazi, bensì salvarli all'interno della stringa (anche perchè dopo andranno scritti su file).

Accettasi consigli, sono disperato! :cry: :cry: :cry:

Albi89
23-06-2008, 19:36
Buonasera.

Vorrei sapere se esiste un metodo per inserire spazi nelle stringhe senza che crashi il programma. Esempio.

char nome[20];
cin >> nome;

Se inserisco come input "Giacomo Rossi", spazio incluso, si impalla il programma.

Non voglio eliminare gli spazi, bensì salvarli all'interno della stringa (anche perchè dopo andranno scritti su file).

Accettasi consigli, sono disperato! :cry: :cry: :cry:

Ti consiglio di usare il metodo getline su cin.
In questo caso cin.getline(nome, 20); dovrebbe fare al caso tuo ;)

71104
23-06-2008, 20:14
eh...? semmai volevi dire questo:

string line;
getline(cin, line);

Markycap
23-06-2008, 20:21
Ti ringrazio funziona su programmi semplici, ma non nel nostro.

Sono in un programma complesso, in cui stiamo definendo delle set. Ti copio il codice:


Questo nel cpp.


#include <iostream>
#include <stdlib.h>
using namespace std;
#include "Soci.h"

void Soci::setNome(){
cout << "Inserire nome: "<<endl;
cin.getline(nome, 20);
cout << endl;
}



questo nel .h
#include <iostream>
#ifndef Soci

class Soci {
public:
unsigned int ID;
char nome[20];
char cognome[30];
char indirizzo[30];
int nascitaG;
int nascitaM;
int nascitaA;
char telefono[15];
char codiceFiscale[16];
int scadenzaG;
int scadenzaM;
int scadenzaA;
char sesso;
public:
void setNome();
void setCognome();
void setIndirizzo();
void setNascita();
void setTelefono();
void setCodiceFiscale();
void setScadenza();
void setSesso();
Soci();

};

#endif


questo in un altro cpp


void operazioniSoci::inserimento(){
ofstream filesoci("file_soci.dat",ios::app|ios::binary);
Soci socio;
socio.setNome();
socio.setCognome();
socio.setIndirizzo();
socio.setNascita();
socio.setTelefono();
socio.setCodiceFiscale();
socio.setScadenza();
socio.setSesso();
filesoci.write(reinterpret_cast <const char*> (&socio), sizeof(socio));
filesoci.close();

}


e questo nel main:


operazioniSoci a;
a.inserimento();



Non ci funge! :(

Markycap
23-06-2008, 20:23
eh...? semmai volevi dire questo:

string line;
getline(cin, line);


Non capisco, scusami... come dovrei inserirlo nel programma?

Markycap
23-06-2008, 20:37
Antonio infatti funziona la cin.getline, ma solo in programmi semplici.

Nel mio programma (postato sopra) non funge... :(

71104
23-06-2008, 20:48
perchè non va bene l'uso di getline? si che va bene, proprio quella suggerivo infatti; tu invece suggerivi istream::getline, che anziché in un oggetto string mette i caratteri in un buffer di dimensione prefissata (tipica stronzata da C).


cin.getline(buffer, 20) non equivale a prendere al massimo 20 caratteri dallo stdin e metterli nella zona puntata da buffer (o fermarsi prima se si incontra un newline?) si, e chi ti dice che l'utente inserirà non più di 20 caratteri? :)
(a parte che casomai sarebbero 19 visto che 20 è la dimensione del buffer)

71104
23-06-2008, 20:50
Non capisco, scusami... come dovrei inserirlo nel programma? come ti pare: dopo che l'hai eseguito hai un oggetto string contenente un'intera linea di standard input; per ottenere l'array di caratteri chiama string::c_str.


Antonio infatti funziona la cin.getline, ma solo in programmi semplici. guarda che non è che le STL si accorgono quando un programma diventa troppo complesso e allora smettono di funzionare eh... :D

Albi89
23-06-2008, 21:23
eh...? semmai volevi dire questo:

string line;
getline(cin, line);

No, volevo dire quello che ho detto :fagiano:
Lui usa un char[20], quindi gli ho suggerito quella forma.
Ovviamente se vuole usare string userà la forma che hai suggerito.

si, e chi ti dice che l'utente inserirà non più di 20 caratteri?
(a parte che casomai sarebbero 19 visto che 20 è la dimensione del buffer)
A chi crea il programma non interessa, se lui offre un char[20] è sua premura controllare che l'utente inserisca 20 caratteri, tutto quì.
Comunque non è 19 ma 20, lo spazio per il terminatore è automaticamente sottratto.

guarda che non è che le STL si accorgono quando un programma diventa troppo complesso e allora smettono di funzionare eh...
E quì siamo daccordo, non ho ancora capito qual'è il problema di markycap con getline.

71104
24-06-2008, 00:50
A chi crea il programma non interessa, se lui offre un char[20] è sua premura controllare che l'utente inserisca 20 caratteri, tutto quì. e farebbe come?


Comunque non è 19 ma 20, lo spazio per il terminatore è automaticamente sottratto. si... ma è sbagliato dire che cin.getline(nome, 20) estrae 20 caratteri.

Albi89
24-06-2008, 01:06
e farebbe come?
Basta segnalarlo, se l'utente poi ne inserisce di più sarà il metodo stesso a scartarli

si... ma è sbagliato dire che cin.getline(nome, 20) estrae 20 caratteri.
E' un comportamento in linea con la soluzione che lui ha adottato.
Se ha un char[20] sa gia che di caratteri in fondo ne prenderà 19, quello che conta è che il numero che passa non deve essere il numero di caratteri bensì l'ampiezza del buffer, terminatore incluso.

Questo va oltre il concetto che sia malsano usare un char* per questo scopo in un programma medio in C++, ma non toglie che spesso negli esercizi o nei compiti universitari è richiesto esplicitamente di usarli.