una quitar que programa manejo los haga frase espacios elimine eliminar dev como caracteres cadenas cadena blanco c++ string whitespace trim

c++ - quitar - Recortar espacios en blanco de una cadena



quitar espacios en blanco c# (5)

Sé que hay varias maneras de hacer esto en Java y C que son buenas, pero en C ++ parece que no puedo encontrar una manera de implementar fácilmente una función de recorte de cadenas.

Esto es lo que tengo actualmente:

string trim(string& str) { size_t first = str.find_first_not_of('' ''); size_t last = str.find_last_not_of('' ''); return str.substr(first, (last-first+1)); }

pero cada vez que intento y llamo

trim(myString);

Me sale el error del compilador

/tmp/ccZZKSEq.o: In function `song::Read(std::basic_ifstream<char, std::char_traits<char> >&, std::basic_ifstream<char, std::char_traits<char> >&, char const*, char const*)'': song.cpp:(.text+0x31c): undefined reference to `song::trim(std::string&)'' collect2: error: ld returned 1 exit status

Estoy tratando de encontrar una forma simple y estándar de recortar espacios en blanco iniciales y finales de una cadena sin que ocupe 100 líneas de código, y traté de usar expresiones regulares, pero no pude hacer que eso funcionara también.

Tampoco puedo usar Boost.


Además de responder de @gjha:

inline std::string ltrim_copy(const std::string& str) { auto it = std::find_if(str.cbegin(), str.cend(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); }); return std::string(it, str.cend()); } inline std::string rtrim_copy(const std::string& str) { auto it = std::find_if(str.crbegin(), str.crend(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); }); return it == str.crend() ? std::string() : std::string(str.cbegin(), ++it.base()); } inline std::string trim_copy(const std::string& str) { auto it1 = std::find_if(str.cbegin(), str.cend(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); }); if (it1 == str.cend()) { return std::string(); } auto it2 = std::find_if(str.crbegin(), str.crend(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); }); return it2 == str.crend() ? std::string(it1, str.cend()) : std::string(it1, ++it2.base()); }


Aquí sabrás como podrás hacerlo:

std::string & trim(std::string & str) { return ltrim(rtrim(str)); }

Y las funciones de apoyo se implementan como:

std::string & ltrim(std::string & str) { auto it2 = std::find_if( str.begin() , str.end() , [](char ch){ return !std::isspace<char>(ch , std::locale::classic() ) ; } ); str.erase( str.begin() , it2); return str; } std::string & rtrim(std::string & str) { auto it1 = std::find_if( str.rbegin() , str.rend() , [](char ch){ return !std::isspace<char>(ch , std::locale::classic() ) ; } ); str.erase( it1.base() , str.end() ); return str; }

Y una vez que tengas todo esto en su lugar, puedes escribir esto también:

std::string trim_copy(std::string const & str) { auto s = str; return ltrim(rtrim(s)); }

Prueba esto


Creo que substr () lanza una excepción si str solo contiene el espacio en blanco.

Lo modificaría al siguiente código:

string trim(string& str) { size_t first = str.find_first_not_of('' ''); if (first == std::string::npos) return ""; size_t last = str.find_last_not_of('' ''); return str.substr(first, (last-first+1)); }


Tu código está bien. Lo que estás viendo es un problema de vinculador.

Si pones tu código en un solo archivo como este:

#include <iostream> #include <string> using namespace std; string trim(const string& str) { size_t first = str.find_first_not_of('' ''); if (string::npos == first) { return str; } size_t last = str.find_last_not_of('' ''); return str.substr(first, (last - first + 1)); } int main() { string s = "abc "; cout << trim(s); }

luego haga g++ test.cc y ejecute a.out, verá que funciona.

Debería verificar si el archivo que contiene la función de trim está incluido en la etapa de enlace de su proceso de compilación.


#include <vector> #include <numeric> #include <sstream> #include <iterator> void Trim(std::string& inputString) { std::istringstream stringStream(inputString); std::vector<std::string> tokens((std::istream_iterator<std::string>(stringStream)), std::istream_iterator<std::string>()); inputString = std::accumulate(std::next(tokens.begin()), tokens.end(), tokens[0], // start with first element [](std::string a, std::string b) { return a + " " + b; }); }