Saltar al contenido

¿Cómo puedo comprobar si un string tiene caracteres especiales en C++ efectivamente?

Revisamos de forma completamente cada noticia en nuestro sitio web con el objetivo de mostrarte siempre la información veraz y certera.

Tratar:

std::string  x(/*Load*/);
if (x.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_") != std::string::npos)

    std::cerr << "Errorn";

O intente aumentar las expresiones regulares:

// Note: w matches any word character `alphanumeric plus "_"`
boost::regex test("w+", re,boost::regex::perl);
if (!boost::regex_match(x.begin(), x.end(), test)

    std::cerr << "Errorn";


// The equivalent to w should be:
boost::regex test("[A-Za-z0-9_]+", re,boost::regex::perl);   

Creo que haría el trabajo un poco diferente, tratando el std::string como una colección, y usando un algoritmo. Usando una lambda C++0x, se vería así:

bool has_special_char(std::string const &str) 
    return std::find_if(str.begin(), str.end(),
        [](char ch) ) != str.end();

Al menos cuando se trata de char (no wchar_t), isalnum generalmente usará una tabla de búsqueda, por lo que generalmente será (bastante) más rápido que cualquier cosa basada en find_first_of (que normalmente utilizará una búsqueda lineal en su lugar). IOW, esto es O(N) (N=str.size()), donde algo basado en find_first_of será O(N*M), (N=str.size(), M=pattern.size()).

Si quieres hacer el trabajo con C puro, puedes usar scanf con una conversión de scanset que teóricamente no es portátil, pero es compatible con prácticamente todos los compiladores recientes/populares:

char junk;
if (sscanf(str, "%*[A-Za-z0-9_]%c", &junk))
    /* it has at least one "special" character
else
    /* no special characters */

La idea básica aquí es bastante simple: el scanset salta todos los caracteres no especiales consecutivos (pero no asigna el resultado a nada, debido a la *), luego tratamos de leer un carácter más. Si eso tiene éxito, significa que había al menos un personaje que estaba no omitido, por lo que debemos tener al menos un carácter especial. Si falla, significa que la conversión del scanset coincidió con todo string, por lo que todos los personajes eran "no especiales".

Oficialmente, el estándar C dice que tratar de poner un rango en una conversión de conjunto de escaneo como esta no es portátil (un '-' en cualquier lugar excepto al principio o al final del conjunto de escaneo proporciona un comportamiento definido por la implementación). Incluso ha habido algunos compiladores (de Borland) que fallarían por esto: tratarían A-Z como si coincidieran exactamente con tres caracteres posibles, 'A', '-' y 'Z'. La mayoría de los compiladores actuales (o, más exactamente, las implementaciones de biblioteca estándar) adoptan el enfoque que se asume: "AZ" coincide con cualquier carácter en mayúscula.

No hay forma de usar C o C ++ estándar para hacer eso usando rangos de caracteres, debe enumerar todos los caracteres. Para cadenas C, puede usar strspn(3) y strcspn(3) para encontrar el primer caracter en un string que es miembro o no es miembro de un conjunto de caracteres determinado. Por ejemplo:

// Test if the given string has anything not in A-Za-z0-9_
bool HasSpecialCharacters(const char *str)

    return str[strspn(str, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_")] != 0;

Para cadenas C++, puede usar de manera equivalente el find_first_of y find_first_not_of funciones de miembro.

Otra opción es utilizar el isalnum(3) y funciones relacionadas de la para probar si un carácter dado es alfanumérico o no; tenga en cuenta que estas funciones son dependiente de la configuración regional, por lo que su comportamiento puede (y lo hace) cambiar en otras configuraciones regionales. Si no desea ese comportamiento, entonces no los use. Si elige usarlos, también tendrá que probar los guiones bajos por separado, ya que no hay una función que pruebe "alfabético, numérico o guión bajo", y también tendrá que codificar su propio bucle para buscar el string (o usar std::find con un objeto de función apropiado).

Reseñas y calificaciones del tutorial

Si entiendes que ha sido de ayuda este post, nos gustaría que lo compartas con el resto desarrolladores y nos ayudes a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *