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:
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 ;)
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... :(
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)
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
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.
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.
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.