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.
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.
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());
std :: remove() link è rotto. Link corretto: http://en.cppreference.com/w/cpp/algorithm/remove – SebiSebi
@SebiSebi: Grazie per quello, risolto! –
Analizza la stringa e rimuove tutte le occorrenze rilevate.
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.
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). –
CString sostituire?
sostituire ('\ t', '')
Non funziona. '' sta per carattere NULL (almeno in VC++). Causerà problemi – sharptooth
Penso che voglia dire "". Sembra funzionare per me. – AndyUK
Più specificatamente sostituire ("\ t", "") – AndyUK
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());
Penso che tu abbia i parametri da cancellare() mescolati. Si desidera cancellare * da * l'iteratore restituito da remove() alla * fine * di str. –
oops :) si, certo. –
+2 per te Konrad! :) –
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);
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. –
Hai ragione, ho dimenticato di usare l'idioma di cancellazione/rimozione. Corretto. –
+2 anche per te Luc :) –
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'));
Penso che tu abbia commesso lo stesso errore di Konrad Rudolph - devi cancellare * da * l'iteratore restituito da std :: remove() alla * fine * della stringa. –
+2 per la correzione graham. –
Sì, correre per essere il primo significa che devi programmare velocemente. –
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(""));
Quale intestazione/libreria includere per l'utilizzo dei metodi TrimRight e Trim sulla stringa? Ho fatto #include
@FarazAhmad CString Stefan usa una classe a parte. È dall'intestazione afx.h. Puoi usarlo collegando a MS Common Runtime Library in Windows. – nurettin
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;
}
Perché non gestirà correttamente tutti i casi. Salterà solo spazi iniziali, quindi schede iniziali e solo in questo ordine. – rubikonx9
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"? –
Avrei dovuto essere più chiaro su questo, intendevo da qualsiasi punto della stringa. – AndyUK