2009-02-17 11 views
10

¿Alguien puede sugerir una forma de eliminar los caracteres de tabulación ("\ t" s) de una cadena? CString o std :: string.Recortar/eliminar una pestaña (" t") de una cadena

Así que "1E10            ", por ejemplo, se convierte en "1E10".

Gracias de anticipación.

+0

¿Quiere decir solo desde el principio o el final? O desde cualquier lugar de la cadena? ¿Debería dejarse "abc \ tdef" tal cual, o reducirse a "abcdef"? –

+0

Debería haber sido más claro con esto, me refería a cualquier parte de la cadena. – AndyUK

Respuesta

18

hackingwords' answer lo lleva a medio camino allí. Pero std::remove() de <algorithm> en realidad no hace que la cadena sea más corta, simplemente devuelve un iterador que dice "la nueva secuencia terminaría aquí". Es necesario llamar my_string().erase() de hacer eso:

#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() el enlace está roto. Enlace correcto: http://en.cppreference.com/w/cpp/algorithm/remove – SebiSebi

+1

@SebiSebi: ¡Gracias por eso, corregido! –

2

Escanee la cadena y elimine todas las ocurrencias encontradas.

0

primera idea sería utilizar remove

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

Aunque puede que tenga que utilizar en su lugar si remove_if que la comparación no funciona.

+0

remove() es la mitad de eso; también debe cerrar esa llamada para eliminar() con una llamada a myString.erase(), ya que remove() en realidad no acorta la cadena (no lo hace (y puede 't) saber cómo). –

1

¿Cambiar CString?

replace ('\ t', '')

+0

No funcionará. '' representa el carácter NULL (al menos en VC++). Causará problemas. – sharptooth

+0

Creo que quiere decir "". Parece funcionar para mi. – AndyUK

+0

Reemplazar más específicamente ("\ t", "") – AndyUK

6

El algoritmo remove cambia todos los caracteres no ser eliminados al principio, sobrescribir caracteres eliminados pero no modifica la longitud del contenedor (desde funciona en iteradores y no conoce el contenedor subyacente). Para lograr esto, llaman erase:

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

Creo que tienes los parámetros para borrar() mezclados. Desea borrar * de * el iterador devuelto por remove() al * end * de str. –

+0

oops :) sí, por supuesto. –

+0

+2 para usted Konrad! :) –

19

Si desea eliminar todas las ocurrencias de la cadena, a continuación, puede utilizar la erase/remove idioma:

#include <algorithm> 

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

Si desea eliminar únicamente la pestaña en la inicio y final de la cadena, se podría utilizar el 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 

Si se usa Boost es demasiado trabajo, puede rodar su propia función de cortar USI ng find_first_not_of y find_last_not_of métodos de cadena.

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() no hace que la cadena sea más corta; solo devuelve un iterador que dice "la nueva cadena termina aquí". Necesitas llamar a borrar() luego con ese iterador para acortar la cadena. –

+0

Tienes razón, me olvidé de usar el idioma borrar/eliminar. Corregido –

+0

+2 también para ti Luc :) –

2

HackingWords es casi allí: Uso borrar en combinación con quitar.

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

Creo que cometió el mismo error que Konrad Rudolph: necesita eliminar * del * iterador devuelto por std :: remove() al * final * de la cadena. –

+0

+2 para la corrección Graham. –

+0

Sí, correr para ser el primero significa que tienes que codificar rápidamente. –

3

Desde otros ya contestadas cómo hacer esto con std :: string, esto es lo que puede utilizar para CString:

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

si usted quiere deshacerse de todas las pestañas, incluso aquellos dentro de la cadena, utilice

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

¿Qué encabezado/biblioteca incluir para usar los métodos TrimRight y Trim en una cadena? He hecho #include , pero esto no está apareciendo en intellisense. –

+0

@FarazAhmad CString Stefan usa es una clase propia. Es del encabezado afx.h Puede usarlo al enlazar a la biblioteca de tiempo de ejecución común de Microsoft en Windows. – nurettin

0

me pregunto por qué no se recorta una cadena de esta manera:

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

Porque no manejará correctamente todos los casos. Solo se saltará espacios iniciales, luego fichas principales, y solo en este orden. – rubikonx9

Cuestiones relacionadas