|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2002
Messaggi: 3992
|
tipo string e char con i puntatori..aiuto!!!
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 |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
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 Codice:
wrapper_fun( const string& s )
{
fun( s.c_str() );
}
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2002
Messaggi: 3992
|
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. |
|
|
|
|
|
#4 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
Di conseguenza la tua linea di codice dovrebbe diventare piuttosto cosi': Codice:
string** pNomi = new string* [QUANTISONO] Ma piuttosto ti consiglio di cambiare tutti i char* (o i char[]) in stringhe, ad esempio Codice:
...
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;
}
}
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) |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2002
Messaggi: 3992
|
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? |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2002
Messaggi: 3992
|
aiuto!
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
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.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
La cosa piu' semplice che mi viene in mente e' la seguente: Codice:
#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;
}
|
|
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
wops, come non detto, le devi solo contare.
puoi fare cosi' (dovrebbe essere abbastanza comprensibile) Codice:
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;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:32.


















