Newsgroup: it.comp.lang.c++
Titolo: Eliminare gli spazi dalle stringhe.

Salve.
Scusate se sto postando in questo newsgroup con delle domande
banali che sicuramente posso risolvere dando un'occhiata a 
qualche manuale, ma ho l'acqua alla gola e pochissimo tempo
per risolvere un problema.
Non conosco il c++, l'ho usato per un importare in un database
postgresql un file di testo (lavoro in ambiente linux).
Se ho una variabile stringa contenente il seguente valore
"abcde     ", con degli spazi alla fine, come faccio ad eliminare
gli spazi finali in modo che la stringa diventi "abcde"?
Grazie.
-- 
per rispondere togli <toglimi> dall'indirizzo di posta. 

 gli spazi finali in modo che la stringa diventi "abcde"?
Se si tratta effettivamente di una stringa del C++ (detta anche
"std::string", e ottenuta con "#include <string>") un approccio
e`:
    void toglispaziincoda(std::string& lastringa) {
        // trova l'indice dell'ultimo non-spazio della stringa:
        int ultimo_valido = lastringa.find_last_not_of(' ');
        // modifica la stringa di conseguenza:
        if(ultimo_valido < 0) // sono tutti spazi...!
            lastringa="";
        else                         // cancella
            lastringa.erase(ultimo_valido+1);
    }
e vi sono, naturalmente, tantissime alternative simili (ad es.,
l'if/else non e` realmente necessario, perche`, se la stringa
e` fatta tutta di spazi, find_last_not_of ritorna "-1", quindi
la chiamata di erase funziona comunque correttamente; ma
mi pare che, didatticamente, questa espressione possa forse
essere piu` chiara, benche` minimamente meno efficiente).
Se si tratta di qualcosa d'altro, come, ad esempio, un array di
char convenzionalmente terminato da un byte di valore binario
0 (quella che un tempo si chiamava "stringa" in un altro linguaggio,
il C, e che alcuni erroneamente si ostinano a chiamare "stringa"
anche in C++, che invece ha un vero e proprio TIPO stringa...),
occorrono naturalmente approcci diversi.  Ad esempio (dovrai
avere un "#include <string.h>" per accedere alle funzioni C
di gestione delle _cosiddette_ stringhe in questione...):
    void toglispaziincoda(char* lacosiddettastringa) {
        // trova l'indice dell'ultimo non-spazio della cosiddetta stringa:
        int ultimo_valido = strlen(lacosiddettastringa)-1;
        while(ultimo_valido > 0 && 
                 lacosiddettastringa[ultimo_valido] != ' ')
                        --ultimo_valido;
        // modifica la cosiddetta-stringa di conseguenza:
        lacosiddettastringa[ultimo_valido+1] = 0;
    }
Anche qui, ovviamente, le possibili alternative sono tante (ad es.,
molti preferirebbero lavorare con un puntatore all'ultimo non-spazio
piuttosto che con il suo indice nella cosiddetta-stringa, anche se
in pratica il compilatore dovrebbe generare praticamente lo stesso
codice nei due casi -- mi pare che, qui, l'uso dell'indice permetta
forse un epsilon in piu` di chiarezza -- questione di gusti).
Alex

 gli spazi finali in modo che la stringa diventi "abcde"?
Prova qualcosa del genere:
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s = "abcdef     ";
    for ( string::size_type i = 0; i < s.size(); i++ )
        if ( s[ i ] == ' ' )
        {
            s.resize( i - 1 );
            break;
        }
    cout << s << '*' << endl;
}
EMG

         }
Questo toglie tutti i caratteri dal primo blank in avanti,
ad esempio "ciao pipo    " diventa "ciao" mentre a me
era sembrato che fosse richiesto farlo diventare invece
"ciao pipo".  Sia che ad aver capito bene fossi tu, sia
che fossi io, questo sottolinea l'importanza primaria
delle *specifiche* (vedi anche il thread attuale su
it.comp.programmare.win32, dove, a fronte della
richiesta "fare xor di TUTTI i byte della stringa,
prendendo come base 0x7F", alcuni hanno inteso
"fare xor di CIASCUN byte della stringa con 0x7F",
ottenendo una stringa di egual lunghezza, altri, 
fra cui me, "fare xor di TUTTI i byte della stringa
con un accumulatore che inizia a 0x7F", ottenendo
un singolo byte...!).
Alex

        lacosiddettastringa[ultimo_valido] != ' ')
Ho l'impressione che questa riga sia errata.Ovvero, in questo modo il
programma esce dallo while quando trova ultimo_valido =0 oppure se
trova il carattere della stringa equivalente alla barra dello spazio.
Invece il ciclo dovrebbe terminare quando trova il carattere della
stringa diverso dalla barra dello spazio,quindi:
while(ultimo_valido > 0 && lacosiddettastringa[ultimo_valido] == ' ')
Proverò a controllare,ma credo che in questo modo vada bene.
Il Ghenio

"ciao pipo".  Sia che ad aver capito bene fossi tu, sia
La richiesta era proprio questa, cioe' eliminare gli spazi finali
e non quelli all'interno della stringa.
Grazie a tutti.


Chiaro. Non avevo considerato il caso degli spazi interni.
EMG

 while(ultimo_valido > 0 && lacosiddettastringa[ultimo_valido] == ' ')
Giusto!  Cerchiamo un non-spazio, quindi dobbiamo continuare
se il carattere attualmente indiciato e` uno spazio; dunque,
"==" e non "!=".
Alex