Fòrums

Classe de cadena Mac C++: comparació insensible a majúscules i minúscules?

T

fondre

Cartell original
4 de desembre de 2006
Katy, Texas
  • 8 de juny de 2007
He buscat una referència en línia (cppreference.com) i el meu llibre de C++, però no puc trobar una comparació insensible a la cadena. Segurament hi ha comparacions C-String que no distingeixen entre majúscules i minúscules, però prefereixo fer servir una comparació C++ si n'hi ha.

(A més, ara tinc la missió de trobar-lo...)

Gràcies, Todd T

fondre

Cartell original
4 de desembre de 2006


Katy, Texas
  • 8 de juny de 2007
Suposo que podria utilitzar un conjunt de bits OR amb una cadena coneguda més llarga del que necessito de tots els espais en blanc (X'20') i després provar una comparació amb minúscules...

veig

Oct 25, 2004
  • 8 de juny de 2007
És gairebé impossible de creure, però no crec que la biblioteca estàndard de C++ tingui majúscules i minúscules.

Si no voleu o necessiteu preocupar-vos per les localitzacions, aleshores:
_stricmp( str1.c_str(), str2.c_str() )
És la solució més senzilla (també força eficient).

Els locals compliquen bastant les coses (bé, realment són les deficiències de la biblioteca estàndard les que fan que això sigui tan complicat).
A veure si trobo un enllaç per a alguna cosa que tracti de localitzacions...
aquí en teniu una: http://lafstern.org/matt/col2_new.pdf
No sé si realment sap de què parla, però sembla que sí. Continua una estona sobre això perquè pugueu entendre el problema, però podeu saltar al final i consultar l'últim bloc de codi per trobar la seva millor solució. T

fondre

Cartell original
4 de desembre de 2006
Katy, Texas
  • 9 de juny de 2007
Gràcies iSee. Sí, probablement té raó. Tanmateix, per als meus propòsits, treballaré amb codis de caràcters ASCII de 7 bits i crec que aquest fragment de codi serà prou bo.

Gràcies per la confirmació, m'alegro de veure que no només m'ho vaig perdre.

Todd

Codi: |_+_| T

fondre

Cartell original
4 de desembre de 2006
Katy, Texas
  • 10 de juny de 2007
iSee va dir: Si no voleu o necessiteu preocupar-vos per les localitzacions, aleshores:
_stricmp( str1.c_str(), str2.c_str() )
És la solució més senzilla (també força eficient).

D'acord, em rendeixo. On vas venir _stricmp ?

Todd EN

wittegijt

Feb 18, 2007
Eindhoven
  • 11 de juny de 2007
toddburch va dir: D'acord, em rendeixo. On vas venir _stricmp ?

Todd

És una cosa de Windows. Les biblioteques Unix utilitzen strcasecmp, està en .

Wittegijt.

veig

Oct 25, 2004
  • 11 de juny de 2007
toddburch va dir: D'acord, em rendeixo. On vas venir _stricmp ?

Todd

D'acord, perdó per haver-ho llençat.

Vaig pensar que formava part de la biblioteca C estàndard, però no ho és. Només apareix, extraoficialment, amb diferents noms, en diverses implementacions de la biblioteca C. Per tant, una comparació que no distingeix entre majúscules i minúscules tampoc és una part oficial de la biblioteca C oficial. Vaja. Sembla una omissió tan gran. Sota VS, és _stricmp() o stricmp(), a CodeWarrior per a Mac és stricmp() o strcasecmp(), i sota OS X 10.4/Xcode és strcasecmp().

Penso-ho bé, el guió baix principal m'hauria d'haver donat la pista.

Suposo que si voleu ajustar-vos a l'estàndard C, heu d'implementar el vostre amb tolower() (o toupper()) en un bucle.

Vegem que una primera passada podria ser (això està fora del meu cap, codi NO provat):
Codi: |_+_|
De totes maneres, de nou, disculpeu els mals consells. Suposo que no he fet gaire codificació C/C++ a Mac OS X on volia evitar l'API del sistema operatiu (CFString, etc.) des dels dies de CodeWarrior... T

fondre

Cartell original
4 de desembre de 2006
Katy, Texas
  • 11 de juny de 2007
Ahhhha. Té sentit. Gràcies Wittegijt i iSee. He estat llegint la meva 'Enciclopèdia C' (Sybex, 1991) i totes (o almenys moltes) les paraules clau no estàndard de Microsoft també tenen un guió baix per al primer caràcter. M'hauria d'haver avisat.

D'acord, ara a strcasecmp() . El lloc web cppreference.com que he estat utilitzant sembla que només és C/C++ estàndard. He buscat a Google un lloc de referència específic de Mac OS X XCode i no n'he trobat cap. Quin és un bon lloc web de referència de Mac OS X C++? O, hi ha una referència de C++ integrada a l'ajuda de XCode en algun lloc i simplement no l'he trobat? O, a falta de tot això, n'hi ha algun a l'Apple Development Center que també m'he perdut?

Per molt grans que siguin les imatges de disc XCode que descarrego i instal·lo quan se'm demana, segurament hi ha una referència d'idioma a algú; vull dir, les coses de Java que vaig baixar inicialment eren ENORMES.

Todd

Krevnik

Set 8, 2003
  • 11 de juny de 2007
toddburch va dir: D'acord, ara strcasecmp() . El lloc web cppreference.com que he estat utilitzant sembla que només és C/C++ estàndard. He buscat a Google un lloc de referència específic de Mac OS X XCode i no n'he trobat cap. Quin és un bon lloc web de referència de Mac OS X C++? O, hi ha una referència de C++ integrada a l'ajuda de XCode en algun lloc i simplement no l'he trobat? O, a falta de tot això, n'hi ha algun a l'Apple Development Center que també m'he perdut?

Hi és, però no crec que repassi les funcions C que es troben a la capa POSIX, només totes les addicions d'Apple a POSIX. Podeu utilitzar el terminal per accedir a les pàgines de manual d'algunes d'aquestes funcions. 'man strcasecmp' us portarà directament a la pàgina que parla d'aquesta funció i descriu com utilitzar-la.

veig

Oct 25, 2004
  • 11 de juny de 2007
Mirant per Xcode, he trobat un enllaç a aquesta pàgina:

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

que és una taula de continguts per a tot a les pàgines man d'OS X, incloses les funcions de la biblioteca C.

La biblioteca de referència Xcode accedeix a pàgines man a més d'altres recursos, de manera que tots estan disponibles a través de Xcode (utilitzo 'Trobar el text seleccionat a la referència de l'API' tot el temps).

Sembla que les funcions C es troben a la secció 3. Sembla que la documentació de cada funció conté una secció 'estàndard' o 'historial' que dóna informació sobre quin estàndard compleix la funció. Aparentment, strcasecmp() es va moure de 'string.h' a 'strings.h' per motius de compliment. No estic segur de quina manera exactament fa que sigui compatible. Suposo que significa que les funcions no estàndard no haurien d'aparèixer a string.h, de manera que el van moure a un fitxer de capçalera diferent. T

fondre

Cartell original
4 de desembre de 2006
Katy, Texas
  • 11 de juny de 2007
Aquesta és una gran pàgina de referència! Vaig pensar que hi havia informació com aquesta en algun lloc!