2012-02-07 11 views
6

Sé que hay formas de hacer caso ignorar la comparación que implica iterar a través de cadenas o good one en SO necesita otra biblioteca. Necesito poner esto en otras computadoras que pueden no tenerlo instalado. ¿Hay alguna manera de usar las bibliotecas estándar para hacer esto? En este momento solo estoy haciendo ...Comparación de cadenas insensibles a mayúsculas y minúsculas C++

if (foo == "Bar" || foo == "bar") 
{ 
cout << "foo is bar" << endl; 
} 

else if (foo == "Stack Overflow" || foo == "stack Overflow" || foo == "Stack overflow" || foo == "etc.") 
{ 
cout << "I am too lazy to do the whole thing..." << endl; 
} 

Esto podría mejorar drásticamente la legibilidad y usabilidad de mi código. Gracias por leer hasta aquí.

+2

¿No es? Incluso si no hubiera una forma integrada, podría * fácilmente * escribir una función para hacerlo en lugar de hacerlo de forma brutal forzando cada comparación individual. ¿Qué hay de malo en iterar a través de las cuerdas? Eso es lo que hará cualquier biblioteca que vayas a usar de todos modos. –

+3

stricmp está disponible en todas partes. – arx

+0

Qué bibliotecas estándar que están disponibles dependen de qué versión del compilador de C++ planee usar para compilar su binario. Por ejemplo, C++ 0x tiene soporte para expresiones regulares. Para compiladores más antiguos, puede usar stricmp. – Alan

Respuesta

15

strncasecmp

La función strcasecmp() realiza una comparación byte a byte de las cadenas s1 y s2, ignorando el caso de los personajes. Devuelve un entero menor que, igual o mayor que cero si se encuentra que s1, respectivamente, es menor que, para que coincida o sea mayor que s2.

La función strncasecmp() es similar, excepto que compara no más de n bytes de s1 y s2 ...

+0

Gracias, esto finalmente funcionó! – CoffeeRain

+3

@CoffeeRain: ¡De nada! Me alegro de que te haya gustado una función simple de la vieja escuela C sobre macarrones mambo-jumbo C++ :) –

+0

¿se supone que está en blanco? – nfoggia

2

¿por qué no haces todo en minúsculas y luego lo comparas?

tolower()

int counter = 0; 
    char str[]="HeLlO wOrLd.\n"; 
    char c; 
    while (str[counter]) { 
    c = str[counter]; 
    str[counter] = tolower(c); 
    counter++; 
    } 

    printf("%s\n", str); 
+0

Lo estaba intentando, pero no funcionaba muy bien. Podría dar un ejemplo? Trataré de publicar mi código de error ... – CoffeeRain

6

por lo general lo que hago es simplemente comparar una versión con carcasa inferior de la cadena en cuestión, como:

if (foo.make_this_lowercase_somehow() == "stack overflow") { 
    // be happy 
} 

Creo impulso se ha incorporado en las conversiones minúsculas, por lo :

#include <boost/algorithm/string.hpp>  

if (boost::algorithm::to_lower(str) == "stack overflow") { 
    //happy time 
} 
+0

Boost fue el que me vinculó ... No tengo eso. – CoffeeRain

+0

boost es gratuito en todos los sentidos, solo podría tomar el algoritmo de to_lower si no puede instalarlo por alguna razón. –

+1

El valor de retorno de 'to_lower' es nulo. Primero debes aplicar 'to_lower' y luego compararlo como siempre. En gcc, lo anterior le dará un error de "valor nulo no ignorado como debería ser". – Fadecomic

2

puede escribir una función simple para convertir la cadena existente para minúsculas de la siguiente manera:

#include <string> 
#include <ctype.h> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 

std::string make_lowercase(const std::string& in) 
{ 
    std::string out; 

    std::transform(in.begin(), in.end(), std::back_inserter(out), ::tolower); 
    return out; 
} 

int main() 
{ 
    if(make_lowercase("Hello, World!") == std::string("hello, world!")) { 
    std::cout << "match found" << std::endl; 
    } 

    return 0; 
} 
2

que acabo de escribir esto, tal vez, puede ser útil a alguien:

int charDiff(char c1, char c2) 
{ 
    if (tolower(c1) < tolower(c2)) return -1; 
    if (tolower(c1) == tolower(c2)) return 0; 
    return 1; 
} 

int stringCompare(const string& str1, const string& str2) 
{ 
    int diff = 0; 
    int size = std::min(str1.size(), str2.size()); 
    for (size_t idx = 0; idx < size && diff == 0; ++idx) 
    { 
     diff += charDiff(str1[idx], str2[idx]); 
    } 
    if (diff != 0) return diff; 

    if (str2.length() == str1.length()) return 0; 
    if (str2.length() > str1.length()) return 1; 
    return -1; 
} 
Cuestiones relacionadas