Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-05-2003, 06:03   #1
Kleidemos
Bannato
 
L'Avatar di Kleidemos
 
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
[C++]Contare gli spazi

Dovrei contare gli spazi contenuti in una stringa e avrei pensato a questa funz:
Codice:
 
int Spazi(string &st)
{
    int spazi_cont;
    string::iterator it=st.begin();
    for( ; it != st.end(); it++) 
    {
        if( st.find(" ") != string::npos )
        {
        	spazi_cont++;           
        } 
        if( st.find("\0") != string::npos )
        {
                break;
        }    
    }  
    return spazi_cont;
}
Ma mi trova 30000 spazi
Kleidemos è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 07:52   #2
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
Codice:
int Spazi(string &st)
{
    int spazi_cont = 0;
    for(int i = 0; i < st.size(); i++)
    {
          if(st[i] == "")
               spazi_cont ++;
    }

    return spazi_cont;
}
ps: non l'ho testato...
ri è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 08:28   #3
monkey72
Senior Member
 
L'Avatar di monkey72
 
Iscritto dal: Dec 2001
Messaggi: 1385
Re: [C++]Contare gli spazi

Quote:
Originally posted by "Kleidemos"

Dovrei contare gli spazi contenuti in una stringa e avrei pensato a questa funz:
Codice:
 
int Spazi(string &st)
{
    int spazi_cont;
    string::iterator it=st.begin();
    for( ; it != st.end(); it++) 
    {
        if( st.find(" ") != string::npos )
        {
        	spazi_cont++;           
        } 
        if( st.find("\0") != string::npos )
        {
                break;
        }    
    }  
    return spazi_cont;
}
Ma mi trova 30000 spazi
una curiosità... ma l'iteratore string::iterator che hai usato ti dovrebbe permettere la scansione dei caratteri x come lo hai usato tu... premesso che non l'ho mai usato mi sembra di averne visto da qualche parte un uso di enumerazione di stringhe contenute in un vettore...
ripeto non entro nel merito, è solo una curiosità, vorrei capire meglio
__________________
lui è il mio amore: "tesò domani ti regalo un guinzaglio lungo 100 km"
monkey72 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 09:21   #4
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Re: [C++]Contare gli spazi

Non e' molto piu' semplice qualcosa del genere (non testato) ?
Codice:
int Spazi(const string& st)
{
  int result=0;
  for ( string::const_iterator i=st.begin(); i != st.end(); ++i )
  {
    if ( *i == ' ' )
      ++result;
  }
  return result;
}
In ogni caso nel ciclo for non dovresti usare string::npos ma st.end() (ed e' per quello che ti da un risultato sballato)

Edit: ops, mi sono accorto che e' praticamente identico al codice di ri (a parte il " " corretto in ' ' )
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 09:27   #5
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Re: [C++]Contare gli spazi

Quote:
Originally posted by "monkey72"



una curiosità... ma l'iteratore string::iterator che hai usato ti dovrebbe permettere la scansione dei caratteri x come lo hai usato tu... premesso che non l'ho mai usato mi sembra di averne visto da qualche parte un uso di enumerazione di stringhe contenute in un vettore...
ripeto non entro nel merito, è solo una curiosità, vorrei capire meglio
Molto probabilmente string::iterator non e' altro che un altro nome per char*, e quindi usare uno o l'altro non dovrebbe far differenza.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 09:42   #6
monkey72
Senior Member
 
L'Avatar di monkey72
 
Iscritto dal: Dec 2001
Messaggi: 1385
Re: [C++]Contare gli spazi

Quote:
Originally posted by "/\/\@®¢Ø"


In ogni caso nel ciclo for non dovresti usare string::npos ma st.end() (ed e' per quello che ti da un risultato sballato)
xchè? lui sta testando se il carattere corrente è blank, xchè deve controllare che sia finita la stringa?... semmai nel secondo if, ma a che pro, xche string::npos gli fa sballare il risultato?
__________________
lui è il mio amore: "tesò domani ti regalo un guinzaglio lungo 100 km"
monkey72 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 09:46   #7
monkey72
Senior Member
 
L'Avatar di monkey72
 
Iscritto dal: Dec 2001
Messaggi: 1385
p.s. marco secondo me sono giuste sia la tua soluzione che quella di ri, sono semplici ma efficaci, ma volevo capire xchè sballa quella di kleidemos
__________________
lui è il mio amore: "tesò domani ti regalo un guinzaglio lungo 100 km"
monkey72 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 11:11   #8
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
perchè npos è una costante che rappresenta la lunghezza massima di una stringa
l'algoritmo find invece, in caso di "non trovato", restituisce l'end dell'oggetto

[CAZZATA, vedere sotto]prova a fare una stampa di string::npos e vediamo se ti esce 30000 [/CAZZATA]
ri è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 11:15   #9
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Re: [C++]Contare gli spazi

Quote:
Originally posted by "monkey72"



xchè? lui sta testando se il carattere corrente è blank, xchè deve controllare che sia finita la stringa?... semmai nel secondo if, ma a che pro, xche string::npos gli fa sballare il risultato?

porc... stamattina dormo della grossa ! .
Kleidemos, l'errore sta nel fatto che mescoli due modi di operare: da un lato fai la scansione 'manuale' della stringa col ciclo for (ma l'iteratore non lo utilizzi mai!), dall'altro utilizzi il metodo find che fa la scansione di suo: il metodo find cerca tutta la stringa e quindi e' inutile iterare. Il secondo find e' ancora piu' pericoloso: a differenza dei char* non e' necessariamente detto che le string finiscano con un '\0'. Se questo capita (come ad esempio nel gcc) in ogni caso il ciclo termina al primo passaggio perche' il '\0' viene trovato alla fine della stringa.
La soluzione e' quindi:
1- iteri
2- usi find

nel primo caso va bene il codice che ti e' gia' stato mostrato
nel secondo puoi fare cosi'
Codice:
int Spazi(const string &st)
{ 
    int spazi_cont=0;
    string::size_type pos = st.find_first_of( ' ' );
    while( pos != string::npos )
    {
        spazi_cont++;
        pos = st.find_first_of( ' ' , pos+1 );
    }
    return spazi_cont; 
}
(ho usato find_first_of invece che find visto che dovevo cercare un solo carattere, ma anche find sulla strigna andava bene cmq)
Pero' mi sembra una fatica inutile rispetto l'entita' del compito.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 11:15   #10
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061

ho appena controllato quanto vale quel const e mi da -1...
ri è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 11:16   #11
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
dimenticavo...
spazi_cont va inizializzato a zero !
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 11:20   #12
monkey72
Senior Member
 
L'Avatar di monkey72
 
Iscritto dal: Dec 2001
Messaggi: 1385
io sapevo che s.find(c) cerca la prima occorrenza del carattere c nella stringa s e che ritorna un valore intero senza segno che è la posizione di c se c'è, altrimenti ritorna una costante predefinita che è string::npos "non posizione" che vale -1
__________________
lui è il mio amore: "tesò domani ti regalo un guinzaglio lungo 100 km"
monkey72 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 11:22   #13
monkey72
Senior Member
 
L'Avatar di monkey72
 
Iscritto dal: Dec 2001
Messaggi: 1385
Quote:
Originally posted by "ri"


ho appena controllato quanto vale quel const e mi da -1...
appunto....
__________________
lui è il mio amore: "tesò domani ti regalo un guinzaglio lungo 100 km"
monkey72 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 11:32   #14
monkey72
Senior Member
 
L'Avatar di monkey72
 
Iscritto dal: Dec 2001
Messaggi: 1385
Re: [C++]Contare gli spazi

Quote:
Originally posted by "/\/\@®¢Ø"




Codice:
int Spazi(const string &st)
{ 
    int spazi_cont=0;
    string::size_type pos = st.find_first_of( ' ' );
    while( pos != string::npos )
    {
        spazi_cont++;
        pos = st.find_first_of( ' ' , pos+1 );
    }
    return spazi_cont; 
}
non ho più obiezioni
__________________
lui è il mio amore: "tesò domani ti regalo un guinzaglio lungo 100 km"
monkey72 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
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: 21:02.


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