Newsgroup: it.comp.lang.c++
Titolo: String senza spazi iniziali

Salve
 Scusate la domanda "banale", ma esiste un metodo di "string" che mi
restituisce una sottostringa da cui sono stati eliminati tutti gli spazi
iniziali e finali?
Grazie
Killer

Killer ha scritto:

Se intendi che da st = " ciao ";
deve restituire "ciao" 
prova questa funzioncina:
string toglispazi (string s) {
       char ch = 32;
        if (s[0] == ch)
                s = s.erase (0, 1);
                if (s[s.size() - 1] == 32)
                s = s.erase (s.size() - 1, 1);
        return s;
};
ciao
--
Luigi

Luigi ha scritto:

Aspetta, ho notato che intendevi tutti gli spazi iniziali e finali quindi 
dovresti sistemarla con un ciclo for
ciao
--
Luigi

 prova questa funzioncina:
Grazie, era quello che mi serviva (con qualche piccola modifica :D)
Come mai non esiste un metodo "standard" per una cosa del genere?
Forse perche' troppo banale?
Bow-wow
Killer

 ha scritto nel messaggio
news:QDfC6.17295$s93.9...@news.infostrada.it...

Puoi anche utilizzare strtok definita in <string.h>
Questo č un esempio con le "stringhe" c, ma ovviamente č adattabile alla
classe string.
char s[] = " ciao    ";
strcpy(s, strtok(s, " "));;

 dovresti sistemarla con un ciclo for
L'ho scritta cosi' : (se puo' servire a qualcuno)
string toglispazi (string s) {
    while (s[0] == 32)
        s = s.erase (0, 1);
    while(s[s.size() - 1] == 32)
        s = s.erase (s.size() - 1, 1);
    return s;
}
Quale numero devo inserire per includere nell'eliminazione anche le tabulazioni?
Bow-wow
Killer

Quale numero devo inserire per includere nell'eliminazione anche le tabulazioni?
Prova con la funzione 
bool isspace(char);
Luc.

 iniziali e finali?
Intanto cominciamo a definire "spazio"; una cosa e' uno spazio, una
cosa e' whitespace che, a norma ANSI a POSIX, comprende anche form
feed, horizontal tab e qualche altro carattere ancora.  Se e' questa
seconda cosa che intendi, delle istruzioni che eliminano tutto il
whitespace iniziale e finale possono essere qualcosa come:
std::string s("   string con leading & trailing whitespace   ");
char spaces[] = " \f\n\r\t\v";
std::string::size_type inizio = s.find_first_not_of(spaces);
std::string::size_type fine = s.find_last_not_of(spaces);
std::string t = s.substr(inizio, fine-inizio+1);
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
The instructions said to use Windows 98 or better - so I installed FreeBSD.

     while (s[0] == 32)
Penso possa servire solo a chi usa una rappresentazione ANSI dei
caratteri.  Mai sentito parlare di EBCDIC?


Luc <TOGL...@katamail.com-TOGLI> writes:

Ti sei confuso con "int isspace(int);", dichiarata in <cctype> :-)


 std::string t = s.substr(inizio, fine-inizio+1);
Buffoncello!  E se sono _tutti_ whitespaces?  Metti piuttosto un
std::string t = inizio == std::string::npos ? "" : s.substr(inizio, fine-inizio+1);


Ti sei confuso con "int isspace(int);", dichiarata in <cctype> :-)
Ops, la memoria... 8/
Comunque il mio template era più chiaro... ma errato. 8-)

 }
Ma č come la mia, solo che hai messo 32 invece di ch (che valeva 32 :)
Ciao
--
Luigi

 caratteri.  Mai sentito parlare di EBCDIC?
Si, l'avevo letto su un libro all'uni. Su quale piattaforma viene usata ancora
come rappresentazione dei caratteri?
Bow-wow
Killer

 ha scritto nel messaggio news:J41D6.43410$s93.2...@news.infostrada.it...

Ho messo anche i while per indicare tutti gli spazi iniziali/finale :DDD
Grazie tante
Killer

come rappresentazione dei caratteri?
Ad esempio MVS. Probabilmente il sistema che sta dietro la
gestione del tuo conto corrente bancario, della tua
assicurazione, della tua bolletta della luce.
E' il sistema dei "bestioni" IBM ...
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 ha scritto nel messaggio
news:QDfC6.17295$s93.9...@news.infostrada.it...

No.
Ma è facile scriversi una funzione apposita.
Ecco un esempio che fa uso degli iteratori:
#include <string>
#include <iterator>
#include <cctype>
std::string eatws(const std::string& s)
{
    typedef std::string::const_iterator CIter;
    // cerca gli spazi all'inizio
    CIter begin = s.begin();
    while(std::isspace(*begin) && (begin != s.end()) ) ++begin;
    // cerca gli spazi alla fine
    std::reverse_iterator<CIter> rbegin = s.rbegin();
    while(std::isspace(*rbegin) && (rbegin != s.rend()) ) ++rbegin;
    return (begin < rbegin.base()) ? std::string(begin, rbegin.base())
                                   : std::string("");
}
Saluti   Manlio Perillo

 E' il sistema dei "bestioni" IBM ...
Il che, in parte, spiega perche' tutte e tre queste cose danno spesso problemi
;-P
--
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

;-P
Basterebbe anche la più moderna codifica UNICODE a far saltare codici
del genere... 8)
Luc.

 std::string t = inizio == std::string::npos ? "" : s.substr(inizio, fine-inizio+1);
Wow, devo ancora imparare un mucchio di cose :D
Grazie mille
Killer

 E' il sistema dei "bestioni" IBM ...
Il mio libro e' molto vecchio (considera il 486 come processore + performante :/)
e credevo che quello standard fosse in disuso...
Devo sostituire 32 con ' ' ?
Grazie
Killer

 Ecco un esempio che fa uso degli iteratori:
[CUT]
E' bello vedere in quanti modi si possa risolvere un problema "banale" :D
Grazie mille
Killer

 Devo sostituire 32 con ' ' ?
potresti vedere il file trim.h di B. Eckel su Thinking in C++ "ed 
Volume II, 
www.bruceeckel.com

 ha scritto nel messaggio news:1078385.l...@tin.it...

Ok, grazie tante
Killer

std::sStrin te=  inizo ==>std::sStrin::npos.? "" : ussubost( inizo,i fin- inizo+1);>
Wrow,edevo ancor iomlaroreuns mucchio di oise:D?
Grazia milie
Killer