Pergunta

Qual é a melhor maneira que as pessoas encontraram para fazer String em minúsculas/maiúsculas em C++?

A questão é complicada pelo fato de que C++ não é uma linguagem de programação apenas em inglês.Existe um bom método multilíngue?

Foi útil?

Solução

#include <algorithm>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);

http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/

Além disso, artigo do CodeProject para métodos de string comuns: http://www.codeproject.com/KB/stl/STL_string_util.aspx

Outras dicas

> std::string data = “Abc”; 
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);

Isso funcionará, mas usará o código de idioma "C" padrão.Você pode usar facetas se precisar obter um tolower para outro local.O código acima usando facetas seria:

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

Para copiadores que desejam usar a resposta de Nic Strong, observe o erro de ortografia em "use_factet" e o terceiro parâmetro ausente em std::transform:

locale loc("");
const ctype<char>& ct = use_factet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

deveria estar

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

Você também deve revisar essa questão.Basicamente, o problema é que as bibliotecas C/C++ padrão não foram construídas para lidar com dados Unicode, então você terá que procurar outras bibliotecas.

Isso pode mudar à medida que o padrão C++ for atualizado.Eu sei que o próximo compilador da Borland (CodeGear) terá suporte a Unicode, e eu acho que o compilador C++ da Microsoft terá, ou já possui, bibliotecas de strings que suportam Unicode.

Como Darren lhe disse, o método mais fácil é usar std::transform.

Mas tome cuidado, pois em alguns idiomas, como o alemão, por exemplo, nem sempre há um mapeamento individual entre letras minúsculas e maiúsculas.O caractere minúsculo “esset” (parecido com o caractere grego beta) é transformado em “SS” em maiúsculas.

Se você tem Boost, então tem a maneira mais simples.Dê uma olhada em to_upper()/to_lower() em algoritmos de string Boost.

Eu encontrei uma maneira de converter o caso de caracteres Unicode (e multilíngues), mas você precisa saber/encontrar (de alguma forma) a localidade do caractere:

#include <locale.h>

_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale));
_free_locale(locale);

Ainda não encontrei uma maneira de fazer isso...Se alguém souber como, me avise.

Definir localidade como NULL não funciona...

O VCL tem um SysUtils.hpp que tem LowerCase(unicodeStringVar) e UpperCase(unicodeStringVar) o que pode funcionar para você.Eu uso isso no C++ Builder 2009.

O que Steve diz está certo, mas acho que se o seu código tivesse que suportar várias linguagens, você poderia ter um método de fábrica que encapsulasse um conjunto de métodos que executassem o toUpper ou toLower relevante com base nessa linguagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top