Foros

Clase de cadena de Mac C ++ - ¿comparar mayúsculas y minúsculas?

T

fundir

Poster original
4 de diciembre de 2006
Katy, Texas
  • 8 de junio de 2007
Busqué en una referencia en línea (cppreference.com) y en mi libro de C ++, pero no puedo encontrar una comparación insensible a cadenas (). Ciertamente, hay comparaciones que no distinguen entre mayúsculas y minúsculas de C-String, pero prefiero usar una comparación de C ++ si hay una.

(Además, ahora tengo la misión de encontrarlo ...)

Gracias, Todd T

fundir

Poster original
4 de diciembre de 2006


Katy, Texas
  • 8 de junio de 2007
Supongo que podría usar un conjunto de bits O con una cadena conocida de todos los espacios en blanco más larga de la necesaria (X'20 ') y luego probar una comparación de minúsculas ...

veo

Oct 25, 2004
  • 8 de junio de 2007
Es casi increíble, pero no creo que la biblioteca estándar de C ++ tenga una diferencia entre mayúsculas y minúsculas.

Si no quiere o necesita preocuparse por las configuraciones regionales, entonces:
_stricmp (str1.c_str (), str2.c_str ())
Es la solución más simple (también bastante eficiente).

Las configuraciones regionales complican un poco las cosas (bueno, son realmente las deficiencias de la biblioteca estándar las que hacen que esto sea tan complicado).
Déjame ver si puedo encontrar un enlace para algo que se ocupe de las configuraciones regionales ...
Aquí hay uno: http://lafstern.org/matt/col2_new.pdf
No sé si realmente sabe de lo que está hablando, pero parece que sí. Continúa un rato sobre esto para que pueda comprender el problema, pero puede ir al final y ver el último bloque de código para encontrar su mejor solución. T

fundir

Poster original
4 de diciembre de 2006
Katy, Texas
  • 9 de junio de 2007
Gracias iSee. Sí, probablemente tenga razón. Sin embargo, para mis propósitos, trabajaré con códigos de caracteres ASCII de 7 bits y creo que este fragmento de código será lo suficientemente bueno.

Gracias por la confirmación, me alegro de ver que no me lo estaba perdiendo.

Todd

Código: #include #include using namespace std ; bool case_insensitive_compare( string a, string b) { char char1, char2, blank = ' ' ; int len1 = a.length() ; int len2 = b.length() ; for (int i = 0 ; i input ; result = case_insensitive_compare(input, hello) ; std::cout << 'Result of compare of ' << input << ' to ' << hello << ' is ' << (result ? 'true' : 'false' ) << endl ; return 0; } T

fundir

Poster original
4 de diciembre de 2006
Katy, Texas
  • 10 de junio de 2007
iSee dijo: Si no quiere o necesita preocuparse por las configuraciones regionales, entonces:
_stricmp (str1.c_str (), str2.c_str ())
Es la solución más simple (también bastante eficiente).

Esta bien me rindo. ¿De dónde se te ocurrió? _stricmp ?

Todd EN

Wittegijt

Feb 18, 2007
Eindhoven
  • 11 de junio de 2007
Toddburch dijo: OK, me rindo. ¿De dónde se te ocurrió? _stricmp ?

Todd

Es una cosa de Windows. Las bibliotecas de Unix usan strcasecmp, está en formato.

Wittegijt.

veo

Oct 25, 2004
  • 11 de junio de 2007
Toddburch dijo: OK, me rindo. ¿De dónde se te ocurrió? _stricmp ?

Todd

OK, perdón por tirar eso por ahí.

Pensé que era parte de la biblioteca C estándar, pero no lo es. Simplemente aparece, extraoficialmente, con diferentes nombres, en varias implementaciones de la biblioteca C. Por lo tanto, una comparación que no distingue entre mayúsculas y minúsculas tampoco es una parte oficial de la biblioteca oficial de C. Caray. Parece una omisión tan grande. En VS, es _stricmp () o stricmp (), en CodeWarrior para Mac es stricmp () o strcasecmp (), y en OS X 10.4 / Xcode es strcasecmp ().

Ahora que lo pienso, el subrayado inicial debería haberme dado la pista.

Supongo que si desea cumplir con el estándar C, debe implementar el suyo propio usando tolower () (o toupper ()) en un bucle.

Veamos que un primer paso podría ser (esto está fuera de mi cabeza, NO es un código probado):
Código: #include ... int mystricmp(const char* str1, const char* str2) { if (str1 == str2) return 0; else if (str1 == NULL) return -1; else if (str2 == NULL) return 1; else { while (tolower(*str1) == tolower(*str2) && *str1 != 0 && *str2 != 0) { ++str1; ++str2; } if (*str1 *str2) return 1; else return 0; } }
De todos modos, de nuevo, perdón por el mal consejo. Supongo que no he hecho mucho código C / C ++ en Mac OS X donde quería evitar la API del sistema operativo (CFString, etc.) desde los días de CodeWarrior ... T

fundir

Poster original
4 de diciembre de 2006
Katy, Texas
  • 11 de junio de 2007
Ahhhha. Tiene sentido. Gracias Wittegijt e iSee. He estado leyendo mi 'Enciclopedia C' (Sybex, 1991) y todas (o muchas, al menos) las palabras clave no estándar de Microsoft también tienen un guión bajo para el primer carácter. Debería haberme avisado.

OK, ahora a strcasecmp () . El sitio web cppreference.com que he estado usando parece ser solo C / C ++ estándar. Busqué en Google un sitio de referencia específico de Mac OS X XCode y no encontré ninguno. ¿Qué es un buen sitio web de referencia de Mac OS X C ++? ¿O hay una referencia de C ++ integrada en la ayuda de XCode en algún lugar y simplemente no la he encontrado? O, fallando todo eso, ¿hay uno en el Centro de Desarrollo de Apple que también me he perdido?

Tan grandes como son las imágenes de disco de XCode que descargo e instalo cuando se me solicita, seguramente hay una referencia de lenguaje allí, alguien; quiero decir, las cosas de Java que descargué inicialmente eran ENORMES.

Todd

Krevnik

Sep 8, 2003
  • 11 de junio de 2007
Toddburch dijo: OK, ahora para strcasecmp () . El sitio web cppreference.com que he estado usando parece ser solo C / C ++ estándar. Busqué en Google un sitio de referencia específico de Mac OS X XCode y no encontré ninguno. ¿Qué es un buen sitio web de referencia de Mac OS X C ++? ¿O hay una referencia de C ++ integrada en la ayuda de XCode en algún lugar y simplemente no la he encontrado? O, fallando todo eso, ¿hay uno en el Centro de Desarrollo de Apple que también me he perdido?

Está ahí, pero no creo que repase las funciones de C que están en la capa POSIX, solo todas las adiciones de Apple a POSIX. Puede utilizar el terminal para acceder a las páginas de manual de algunas de estas funciones. 'man strcasecmp' lo llevará directamente a la página que habla de esa función y describirá cómo usarla.

veo

Oct 25, 2004
  • 11 de junio de 2007
Buscando en Xcode, encontré un enlace a esta página:

http://developer.apple.com/documentation/Darwin/Reference/ManPages/index.html

que es una tabla de contenido para todo en las páginas de manual de OS X, incluidas las funciones de la biblioteca C.

La biblioteca de referencia de Xcode accede a las páginas de manual además de otros recursos, por lo que todos están disponibles a través de Xcode (yo uso 'Buscar texto seleccionado en la referencia de API' todo el tiempo).

Parece que las funciones de C están en la sección 3. Parece que la documentación de cada función contiene una sección 'estándar' o 'historial' que proporciona información sobre el estándar con el que cumple la función. Aparentemente strcasecmp () se movió de 'string.h' a 'strings.h' por razones de cumplimiento. No estoy seguro exactamente de qué manera eso lo hace compatible. Supongo que significa que las funciones no estándar no deberían aparecer en string.h, por lo que lo movieron a un archivo de encabezado diferente. T

fundir

Poster original
4 de diciembre de 2006
Katy, Texas
  • 11 de junio de 2007
¡Esa es una gran página de referencia! ¡Pensé que información como esa estaba allí en alguna parte!