PDA

View Full Version : dubbio stringhe c++ un secondo per rispondere!


leomeya
23-12-2003, 23:38
scusate ma se io voglio passare una stringa da tastiera posso fare
char a[100];
for (int i=0;i<100;i++)
cin << a[i];

e al primo carattere nullo si ferma!

oppure:
char *a;
cin << a;
i miei dubbi sono 2:
-non sono sicuro se char *a lo devo inizializzare subito perche' gli passo una stringa costante;
-volevo sapere se con il puntatore a caratteri c'e' un modo per passargli la stringa come nell'array ovvero a pezzi, carattere dopo carattere magari con l'aritmetica dei puntatori, oppure è sbagliato perche' essendo una stringa costante la devo passare tutta insieme!

/\/\@®¢Ø
24-12-2003, 01:33
char a[100];
for (int i=0;i<100;i++)
cin << a[i];

Non occorre leggere un carattere alla volta (tra l'altro si fa in maniera diversa), puoi leggere direttamente l'array.

cin >> a; // occhio alla direzione ! >> e non <<

In questo modo leggi tutti i caratteri fino al primo carattere di spaziatura.
Se leggere una riga alla volta devi usare

cin.getline( a , 100 );

Se invece vuoi leggere esattamente cento caratteri

cin.getline( a , 100 , EOF );

Occhio alla quantita' di testo immesso ! Se scrivi piu' di 100 caratteri in una riga,
la getline del secondo esempio non leggera' tutta la riga. Peggio ancora,
se inserisci piu' di 100 caratteri senza spaziature cin >> a sforera' l'array con nefasti risultati. Una soluzione parziale al secondo problema puo' essere la segue:

cin.getline( a , 100 , ' ' );

In questo modo la lettura si fermera' a 100 caratteri ma almeno non sfori l'array.
Usare il puntatore non e' molto differente, devi pero' inizializzare l'array:

char* a;
a = new char[100];
...

Perche' la stringa che vai ad utilizzare non e' affatto costante.
( const char* x = "ciao" lo e').
In ogni caso non e' un problema accedere a tali stringhe come se fossero array.

Il consiglio mio e' pero' quello di utilizzare le string della libreria C++ per la lettura, molto piu' pratiche. Al piu' poi ti copi quel che ti serve in una stringa "stile C".