Fóruns

Classe de string Mac C ++ - comparação sem distinção entre maiúsculas e minúsculas?

T

derreter

Pôster original
4 de dezembro de 2006
Katy, Texas
  • 8 de junho de 2007
Eu olhei em uma referência online (cppreference.com) e meu livro C ++, mas não consigo encontrar um compare () insensível a string. Certamente há comparações que não diferenciam maiúsculas de minúsculas da string C, mas prefiro usar uma comparação C ++, se houver.

(Além disso, agora estou em uma missão para encontrá-lo ...)

Obrigado, todd T

derreter

Pôster original
4 de dezembro de 2006


Katy, Texas
  • 8 de junho de 2007
Acho que poderia usar um bitset OR com uma string conhecida mais longa do que o necessário de todos os espaços em branco (X'20 ') e, em seguida, testar uma comparação de minúsculas ...

eu vejo

25 de outubro de 2004
  • 8 de junho de 2007
É quase inacreditável, mas não acredito que a biblioteca C ++ padrão tenha uma distinção entre maiúsculas e minúsculas.

Se você não quiser ou precisar se preocupar com as localidades:
_stricmp (str1.c_str (), str2.c_str ())
É a solução mais simples (também bastante eficiente).

As localidades complicam um pouco as coisas (bem, são realmente as deficiências da biblioteca padrão que tornam isso tão complicado).
Deixe-me ver se consigo encontrar um link de algo que lida com locais ...
aqui está um: http://lafstern.org/matt/col2_new.pdf
Não sei se ele realmente sabe do que está falando, mas parece que sim. Ele continua um pouco sobre isso para que você possa entender o problema, mas você pode pular para o final e verificar o último bloco de código para sua melhor solução. T

derreter

Pôster original
4 de dezembro de 2006
Katy, Texas
  • 9 de junho de 2007
Obrigado iSee. Sim, ele provavelmente está correto. No entanto, para meus propósitos, estarei trabalhando com códigos de caracteres ASCII de 7 bits e acho que esse pedaço de código será bom o suficiente.

Obrigado pela confirmação - fico feliz em ver que eu não estava apenas perdendo isso.

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

derreter

Pôster original
4 de dezembro de 2006
Katy, Texas
  • 10 de junho de 2007
iSee disse: Se você não quiser ou precisar se preocupar com as localidades, então:
_stricmp (str1.c_str (), str2.c_str ())
É a solução mais simples (também bastante eficiente).

Ok eu desisto. De onde você veio _stricmp ?

Todd NO

Wittegijt

18 de fevereiro de 2007
Eindhoven
  • 11 de junho de 2007
toddburch disse: OK, desisto. De onde você veio _stricmp ?

Todd

É uma coisa do Windows. Bibliotecas Unix usam strcasecmp, está em.

Wittegijt.

eu vejo

25 de outubro de 2004
  • 11 de junho de 2007
toddburch disse: OK, desisto. De onde você veio _stricmp ?

Todd

OK, desculpe por jogar isso aí.

Achei que fosse parte da biblioteca C padrão, mas não é. Ele simplesmente aparece, não oficialmente, com nomes diferentes, em várias implementações da biblioteca C. Portanto, uma comparação sem distinção entre maiúsculas e minúsculas também não é uma parte oficial da biblioteca C oficial. Nossa. Parece uma omissão tão grande. No VS, é _stricmp () ou stricmp (), no CodeWarrior para Mac é stricmp () ou strcasecmp () e no OS X 10.4 / Xcode é strcasecmp ().

Venha para pensar sobre isso, o sublinhado principal deveria ter me dado a dica.

Eu acho que se você deseja estar em conformidade com o padrão C, você deve implementar o seu próprio usando tolower () (ou toupper ()) em um loop.

Vamos ver uma primeira passagem pode ser (isso está fora do topo da minha cabeça, NÃO o código testado):
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 qualquer forma, novamente, desculpe pelo conselho ruim. Acho que não tenho feito muita codificação C / C ++ no Mac OS X onde queria evitar a API do sistema operacional (CFString, etc.) desde os dias do CodeWarrior ... T

derreter

Pôster original
4 de dezembro de 2006
Katy, Texas
  • 11 de junho de 2007
Ahhhha. Faz sentido. Obrigado Wittegijt e iSee. Tenho lido minha 'Enciclopédia C' (Sybex, 1991) e todas (ou muitas, pelo menos) as palavras-chave fora do padrão da Microsoft também têm um sublinhado para o primeiro caractere. Deveria ter me avisado.

OK, agora para strcasecmp () . O site cppreference.com que estou usando parece ser apenas C / C ++ padrão. Eu pesquisei por um site de referência específico do Mac OS X XCode e não encontrei um. O que é um bom site de referência do Mac OS X C ++? Ou existe uma referência de C ++ embutida na ajuda do XCode em algum lugar e eu simplesmente não a encontrei? Ou, na falta de tudo isso, há algum no Apple Development Center que eu também perdi?

Tão grande quanto os diskimages do XCode são que eu baixa e instalo quando solicitado, certamente há uma referência de linguagem lá em alguém - quer dizer, o material Java que baixei inicialmente era ENORME.

Todd

Krevnik

8 de setembro de 2003
  • 11 de junho de 2007
toddburch disse: OK, agora para strcasecmp () . O site cppreference.com que estou usando parece ser apenas C / C ++ padrão. Eu pesquisei por um site de referência específico do Mac OS X XCode e não encontrei um. O que é um bom site de referência do Mac OS X C ++? Ou existe uma referência de C ++ embutida na ajuda do XCode em algum lugar e eu simplesmente não a encontrei? Ou, na falta de tudo isso, há algum no Apple Development Center que eu também perdi?

Ele está lá, mas não acho que vá além das funções C que estão na camada POSIX, apenas todas as adições da Apple ao POSIX. Você pode usar o terminal para acessar as páginas do manual sobre algumas dessas funções. 'man strcasecmp' o levará direto para a página que fala sobre essa função e descreverá como usá-la.

eu vejo

25 de outubro de 2004
  • 11 de junho de 2007
Procurando no Xcode, encontrei um link para esta página:

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

que é um índice para tudo nas páginas de manual do OS X, incluindo as funções da biblioteca C.

A biblioteca de referência do Xcode acessa páginas do manual, além de outros recursos, portanto, todos estão disponíveis por meio do Xcode (eu uso 'Localizar texto selecionado na referência da API' o tempo todo).

Parece que as funções C estão na seção 3. Parece que a documentação de cada função contém uma seção 'padrão' ou 'histórico' que fornece algumas informações sobre o padrão com o qual a função está em conformidade. Aparentemente strcasecmp () foi movido de 'string.h' para 'strings.h' por motivos de conformidade. Não tenho certeza de como isso o torna compatível. Eu acho que isso significa que funções não padrão não devem aparecer em string.h, então eles o moveram para um arquivo de cabeçalho diferente. T

derreter

Pôster original
4 de dezembro de 2006
Katy, Texas
  • 11 de junho de 2007
Essa é uma ótima página de referência! Achei que informações como essa estavam lá em algum lugar!