Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-03-2004, 15:43   #1
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
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
lucas72 č offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2004, 17:50   #2
/\/\@®¢Ų
Bannato
 
L'Avatar di /\/\@®¢Ų
 
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() );
}
/\/\@®¢Ų č offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2004, 17:47   #3
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
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.
lucas72 č offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2004, 19:42   #4
/\/\@®¢Ų
Bannato
 
L'Avatar di /\/\@®¢Ų
 
Iscritto dal: Jul 2000
Cittą: Malo (VI)
Messaggi: 1000
Quote:
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':
Codice:
string** pNomi = new string* [QUANTISONO]
etc.

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; 
 } 
 }
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)
/\/\@®¢Ų č offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 18:35   #5
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
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 č offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 20:59   #6
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
aiuto!
lucas72 č offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 21:47   #7
anx721
Senior Member
 
L'Avatar di anx721
 
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
anx721 č offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 22:35   #8
/\/\@®¢Ų
Bannato
 
L'Avatar di /\/\@®¢Ų
 
Iscritto dal: Jul 2000
Cittą: Malo (VI)
Messaggi: 1000
Quote:
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:

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;
}
Che ti ritorna (dovrebbe, l'ho scritta al volo) un vector con tutte le parole
/\/\@®¢Ų č offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 22:44   #9
/\/\@®¢Ų
Bannato
 
L'Avatar di /\/\@®¢Ų
 
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;
}
/\/\@®¢Ų č offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB č On
Le Faccine sono On
Il codice [IMG] č On
Il codice HTML č Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:27.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v