PDA

View Full Version : tipo string e char con i puntatori..aiuto!!!


lucas72
28-03-2004, 15:43
Ciao a tutti
Vorrei modificare il codice sotto sostituenso il tipo string con il tipo char
(stringa di caratteri), in quanto vorrei sfruttare una funzione di un altro programma che con il tipo char funzione e con string no!
(forse è anche colpa mia, che non ho capito bene la differenza tra i due tipi e il modo di usarli)

#include <iostream>
#include <string>
using namespace std;


char responso[256];

/* Prototipi di funzione */

void legginomi(string *source,int numelementi);
void visualizzanomi(string *source,int numelementi);

int main()
{
int QUANTISONO = 0;
cout << "Quante persone ci sono nella tua famiglia? ";
cin.getline(responso,256);
QUANTISONO = atoi(responso);

string* pNomi = new string[QUANTISONO];
legginomi(pNomi,QUANTISONO);


cout << endl << "I " << QUANTISONO << " nomi che hai inserito sono " << endl << endl;

visualizzanomi(pNomi,QUANTISONO);

delete [] pNomi; //Cancella l'array dal free store
pNomi = 0; //Assegna un valore null al puntatore
system ("PAUSE");
return 0;
}

void legginomi(string *source,int numelementi)
{
for (int riga = 0; riga < numelementi; riga++)
{
cout << "Inserisci il nome #" << riga+1 << " ";
cin.getline(responso,256);
source[riga] = responso;
}
}

void visualizzanomi(string *source,int numelementi)
{
for (int riga = 0; riga < numelementi; riga++)
{
cout << source[riga] << endl;
}
}


ho provato e riprovato a sostituire nei fari punti del codice "string"
con "char" con altre modifiche, ma ricevo sempre messaggi di errori dal compilatore (relativo alla chiamata delle funzioni il più delle volte)

grazie

/\/\@®¢Ø
28-03-2004, 17:50
l' "equivalente" C delle string e' il puntatore a char (char*), non il char*, quindi invece che un string* dovrai usare un char**.
Detto questo, secondo me e' decisamente piu' comodo scriversi un wrapper alla funzione che opera sui char* .

ad esempio

wrapper_fun( const string& s )
{
fun( s.c_str() );
}

lucas72
29-03-2004, 17:47
Scusami ma non ci ho capito molto (sono agli inizi!)
cosa è un wrapper e come inserirla nel codice sopra?
Ho provato a sostituire char* a string* nel codice
ma il compilatore mi segnala comunque un errore qui:
string* pNomi = new string[QUANTISONO];

o qui:
legginomi(pNomi,QUANTISONO);


del tipo:
"cannot convert `char*' to `char**' in initialization
Esecuzione terminata"
cosa faccio?
Mi interesserebbe comunque di più capire (ed inserire nel codice sopra)
questa wrapper
ciao e grazie.

/\/\@®¢Ø
29-03-2004, 19:42
Originariamente inviato da lucas72
Scusami ma non ci ho capito molto (sono agli inizi!)
cosa è un wrapper e come inserirla nel codice sopra?
Ho provato a sostituire char* a string* nel codice
ma il compilatore mi segnala comunque un errore qui:
string* pNomi = new string[QUANTISONO];

Puoi considerare una string alla stregua di un char*.
Di conseguenza la tua linea di codice dovrebbe diventare piuttosto cosi':

string** pNomi = new string* [QUANTISONO]

etc.

Ma piuttosto ti consiglio di cambiare tutti i char* (o i char[])
in stringhe,
ad esempio

...
string responso;

/* Prototipi di funzione */

void legginomi(string *source,int numelementi);
void visualizzanomi(string *source,int numelementi);

int main()
{
int QUANTISONO;
cin >> QUANTISONO;

string* pNomi = new string[QUANTISONO];
legginomi(pNomi,QUANTISONO);

cout << endl << "I " << QUANTISONO << " nomi che hai inserito sono " << endl << endl;

visualizzanomi(pNomi,QUANTISONO);

delete [] pNomi; //Cancella l'array dal free store
pNomi = 0; //Assegna un valore null al puntatore
system ("PAUSE");
return 0;
}

void legginomi(string *source,int numelementi)
{
for (int riga = 0; riga < numelementi; riga++)
{
cout << "Inserisci il nome #" << riga+1 << " ";
getline(cin,source[riga]);
}
}

void visualizzanomi(string *source,int numelementi)
{
for (int riga = 0; riga < numelementi; riga++)
{
cout << source[riga] << endl;
}
}


Non ho provato a compilare, ma dovrebbe essere ok.
Il discorso del wrapper e' semplicemnte di definire una funzione "attorno" ad un'altra in modo da non dover riscrivere sempre lo stesso codice (nell'esempio che ho fatto, la conversione da char* a string)

lucas72
30-03-2004, 18:35
grazie ho risolto
il codice che ho scritto è simile a quello che mi hai suggerito.
a questo punto mi chiedevo come si fa a determinare quante parole
sono contenute in una stringa
ad esempio :
"Ciao come stai?"

le parole della stringa sono 3.

Ho messo di proposito più di uno spazio vuoto tra 2 parole
in quanto la mia prima soluzione prevedeva di contare gli spazi vuoti
ed aggiungere 1, ma non è troppo precisa come è dimopstrato sopra.
suggerimenti?

a proposito una stringa quanto può essere lunga?

lucas72
31-03-2004, 20:59
aiuto!

anx721
31-03-2004, 21:47
Ti scorri la stringa posizione per posizione, se nella posizione i c'è un carattere diverso dallo spazio e nella posizione (i-1) c'era uno spazio o (i-1) < 0, incrementi il contatopre di parole. La stringa penso che possa essere lunga quanto ti pare, memoria permettendo.

/\/\@®¢Ø
31-03-2004, 22:35
Originariamente inviato da lucas72
aiuto!

Non ricordo se c'e' un metodo apposito nella libreria standard, ma non mi sembra.
La cosa piu' semplice che mi viene in mente e' la seguente:


#include <vector>
#include <cctype>

using namespace std;

vector<string> split( const string& s )
{
string::size_type i;
vector<string> result;
do
{
while( i < s.size() && isspace( s[i] ) )
++i;
string s2;
if ( i == s.size() ) break;
while( i < s.size() && !isspace( s[i] ) )
s2+=s[i++];
result.push_back( s2 );
} while( i < s.size() );
return result;
}

Che ti ritorna (dovrebbe, l'ho scritta al volo) un vector con tutte le parole

/\/\@®¢Ø
31-03-2004, 22:44
wops, come non detto, le devi solo contare.

puoi fare cosi' (dovrebbe essere abbastanza comprensibile)


typedef string::const_iterator It;

int count_words( const string& s )
{
int count,i=0;
while ( true )
{
while( i < s.size() && s[i]==' ')
++i;
if ( i == s.size() ) break;
while( i < s.size() && s[i] != ' ')
++i
count++;
}
return count;
}