Newsgroup: it.comp.lang.c++
Titolo: Tagliare una stringa

Ho questo problema, ho una string, devo costruirne un'altra eliminando
il primo carattere dalla prima, come posso fare?
-- 
  _  _  >>Now at work<<  _     || ICQ number.................Non lo uso
 | \| |___ _____ ___ ___|_|___ || Home-Page ................Non ce l'ho
 | .` | -_|     | -_|_ -| |_ -||| E-Mail................Non l'avrai mai
 |_|\_|___|_|_|_|___|___|_|___||| Un Nemesis che ha pochi e-contatti ;)

 il primo carattere dalla prima, come posso fare?
std::string s1 = "abcdefgh";
std::string s2(++s1.begin(), s1.end());


thanks :)

 std::string s2(++s1.begin(), s1.end());
ops, begin() non e' lvalue, ci vuole s1.begin()+1

il primo carattere dalla prima, come posso fare?
Usi il metodo substr delle std::string.
std::string newstr=oldstr.substr(1,oldstr.size()-1);
Il Ghenio
-----
These are my parting words to you:
those who give up are doomed!
-----


OK :)



Forse si, forse no... :-)
Ciao,
Nicola


Che belli gli standard...
...ci sono tanti modi per violarli :)


 Forse si, forse no... :-)
perche' forse no?
gli iteratori di std::string sono ad accesso casuale, quindi esiste 
sicuramente un operator+(std::string::iterator, 
iterator_traits<std::string::iterator>::difference_type).
O no?
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

il primo carattere dalla prima, come posso fare?
Oltre ai metodi suggeriti:
<CODE>
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s, t;
    s = "mano";
    t = string(s.c_str()+1);
    cout << s << endl;
    cout << t << endl;
    return 0;
}
</CODE>
-- 
The Follet

 perche' forse no?
Credo Nicola si rifersse al fatto dell' l-valueness di begin(), che 
cambia a seconda delle implementazioni


No, l'lvalue-ness non cambia, ci mancherebbe. Ma se l'iteratore di
std::string e' una classe l'espressione ++s1.begin() e' valida, quindi
*non* e' detto che ci voglia s1.begin()+1 , anche se mi sembra un modo
piu' solido di scrivere il codice.
Ciao,
Nicola

 piu' solido di scrivere il codice.
ah, credevo che il "forse no" fosse riferito ad s1.begin()+1.
Cmq resta il fatto che per scrivere un programma portabile e' 
necessario usare il begin()+1.


 necessario usare il begin()+1.
Esatto. E' l'esempio classico del perche' il consentire di invocare
funzioni membro, e per di piu' anche non const, su valori temporanei
puo' essere stato un errore da parte del comitato.
Ciao,
Nicola

 > necessario usare il begin()+1.
Piccola nota a margine. Usare begin()+1 è corretto solo per iteratori
random access. Nel caso di stringhe, vectors o deque va tutto bene. Ma
per abitudine sarebbe meglio scrivere advance(begin()) che vale per
tutti gli iteratori da forward in su.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 tutti gli iteratori da forward in su.
domanda: 
e' da preferirsi anche nei cicli, al posto di ++iteratore?

 wrote in message
news:1496582.l...@iol.it...

No. Nei cicli l'iteratore è sempre un l-value e pertanto puoi
tranquillamente usare il ++. L'uso di advance(i) è preferibile all'uso
di i+1 non a quello di ++i. E comunque, se lo usi, la sintassi sarebbe
i=advance(i)


 i=advance(i)
 
ti riporto una frase dello Stroustrup:
"Allo stesso modo [si riferisce a std::distance] advance() viene 
fornita nella forma di un operatore += potenzialmente lento:
  template<class In, class Dist> void advance(In i, Dist n); // i+=n
"
Quindi la sintassi proposta da Stroustrup e' diversa da quella che 
proponi tu. Inoltre credo ci sia un errore nella dichiarazione di B.S., 
perche' se "i" non e' passato per riferimento non vedo come possa essre 
modificato.
Chi ha ragione?


 Chi ha ragione?
Lui :-<
In realtà è corretto dire che se non hai modificato tu l'header della
STL (azz, me ne ero dimenticato) advance richiede anche il numero di
passi e che non puoi usarla come proponevo io. Pertanto ritiro tutto.
Però non sono l'unico a confondersi. Come giustamente hai notato tu (se
non è un errore tuo nel riportare la cosa), il prototipo presentato da
BS è sbagliato. Dovrebbe essere così:
template<class In, class Dist> void advance(In &i, Dist n); // i+=n


 passi e che non puoi usarla come proponevo io. Pertanto ritiro tutto.
Hai modificato l'Header della STL?
Ma sei un criminale......  :-)
Ciao
Gaetano.
-- 
Posted from 
nts-03.mm.eutelsat.org
 [194.214.173.15] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Ma sei un criminale......  :-)
Ne faccio di peggio. Di molto peggio!


 Ne faccio di peggio. Di molto peggio!
beh, a questo punto siamo curiosi...


 beh, a questo punto siamo curiosi...
Sarebbe un pochino OT, comunque ... vedrai che quando comincerai a
"giocare" con smalltalk ti verrà la voglia di modificare una cosa qua e
una cosa la ... fino a impallare il sistema.
Però è utile per capire come funziona la cosa ... e quali sono le cose
che se non le capisci forse è meglio :-)
