2009-02-17 12 views
10

Qualcuno può suggerire un modo per rimuovere i caratteri di tabulazione ("\ t" s) da una stringa? CString o std :: string.Taglia/rimuovi una scheda (" t") da una stringa

In modo che "1E10            " per esempio diventa "1E10".

Grazie in anticipo.

+0

Intendi fin dall'inizio o alla fine? O da qualsiasi punto della stringa? Dovrebbe "abc \ tdef" essere lasciato così com'è, o essere ridotto a "abcdef"? –

+0

Avrei dovuto essere più chiaro su questo, intendevo da qualsiasi punto della stringa. – AndyUK

risposta

18

hackingwords' answer ti raggiunge a metà strada. Ma std::remove() da <algorithm> in realtà non riduce la stringa - restituisce semplicemente un iteratore che dice "la nuova sequenza terminerà qui". È necessario chiamare my_string().erase() per farlo:

#include <string> 
#include <algorithm> // For std::remove() 

my_str.erase(std::remove(my_str.begin(), my_str.end(), '\t'), my_str.end()); 
+1

std :: remove() link è rotto. Link corretto: http://en.cppreference.com/w/cpp/algorithm/remove – SebiSebi

+1

@SebiSebi: Grazie per quello, risolto! –

2

Analizza la stringa e rimuove tutte le occorrenze rilevate.

0

prima idea sarebbe quella di utilizzare remove

remove(myString.begin(), myString.end(), "\t"); 

Anche se si potrebbe essere necessario utilizzare remove_if, invece, se il confronto non funziona.

+0

remove() è la metà di esso - è necessario anche avvolgere quella chiamata a remove() con una chiamata a myString.erase(), poiché remove() in realtà non accorcia la stringa (non lo fa (e può 't) sapere come). –

1

CString sostituire?

sostituire ('\ t', '')

+0

Non funziona. '' sta per carattere NULL (almeno in VC++). Causerà problemi – sharptooth

+0

Penso che voglia dire "". Sembra funzionare per me. – AndyUK

+0

Più specificatamente sostituire ("\ t", "") – AndyUK

6

Il remove algoritmo sposta tutti i caratteri non essere eliminati all'inizio, sovrascrivendo i caratteri cancellati, ma non modifica la lunghezza del contenitore (dal funziona su iteratori e non conosce il contenitore sottostante). Per raggiungere questo obiettivo, chiamano erase:

str.erase(remove(str.begin(), str.end(), '\t'), str.end()); 
+0

Penso che tu abbia i parametri da cancellare() mescolati. Si desidera cancellare * da * l'iteratore restituito da remove() alla * fine * di str. –

+0

oops :) si, certo. –

+0

+2 per te Konrad! :) –

19

Se si desidera rimuovere tutte le occorrenze della stringa, quindi è possibile utilizzare il erase/remove linguaggio:

#include <algorithm> 

s.erase(std::remove(s.begin(), s.end(), '\t'), s.end()); 

Se si desidera rimuovere solo la scheda al inizio e fine della stringa, è possibile utilizzare il boost string algorithms:

#include <boost/algorithm/string.hpp> 

boost::trim(s); // removes all leading and trailing white spaces 
boost::trim_if(s, boost::is_any_of("\t")); // removes only tabs 

Se si utilizza Boost è troppo alto, si può rotolare il proprio funzione trim USI ng find_first_not_of e find_last_not_of metodi di stringa.

std::string::size_type begin = s.find_first_not_of("\t"); 
std::string::size_type end = s.find_last_not_of("\t"); 

std::string trimmed = s.substr(begin, end-begin + 1); 
+0

std :: remove() non riduce la stringa - restituisce semplicemente un iteratore che dice "la nuova stringa finisce qui". È necessario chiamare s.erase() in seguito con quell'iteratore per abbreviare effettivamente la stringa. –

+0

Hai ragione, ho dimenticato di usare l'idioma di cancellazione/rimozione. Corretto. –

+0

+2 anche per te Luc :) –

2

HackingWords è quasi arrivati: Usa cancellare in combinazione con remove.

std::string my_string = "this\tis\ta\ttabbed\tstring"; 
my_string.erase(std::remove(my_string.begin(), my_string.end(), my_string.end(), '\t')); 
+0

Penso che tu abbia commesso lo stesso errore di Konrad Rudolph - devi cancellare * da * l'iteratore restituito da std :: remove() alla * fine * della stringa. –

+0

+2 per la correzione graham. –

+0

Sì, correre per essere il primo significa che devi programmare velocemente. –

3

Dal altri già risposto come fare questo con std :: string, ecco cosa si può usare per CString:

myString.TrimRight('\t'); // trims tabs from end of string 
myString.Trim('\t'); // trims tabs from beginning and end of string 

se si vuole sbarazzarsi di tutte le schede, anche quelli all'interno del stringa, utilizzare

myString.Replace(_T("\t"), _T("")); 
+0

Quale intestazione/libreria includere per l'utilizzo dei metodi TrimRight e Trim sulla stringa? Ho fatto #include , ma questo non appare in intellisense. –

+0

@FarazAhmad CString Stefan usa una classe a parte. È dall'intestazione afx.h. Puoi usarlo collegando a MS Common Runtime Library in Windows. – nurettin

0

mi chiedo perché nessuno rifila una stringa in questo modo:

void trim (string& s) { 
    string t = ""; 
    int i = 0; 
    while(s[i] == ' ') i++; 
    while(s[i] == '\t') i++; 
    for(i; i < s.length(); i++) 
     t += s[i]; 

    s = t; 
} 
+1

Perché non gestirà correttamente tutti i casi. Salterà solo spazi iniziali, quindi schede iniziali e solo in questo ordine. – rubikonx9

Problemi correlati