Étant donné que vous effectuez des recherches de sous-chaînes (std::string) et non des recherches d'éléments (caractères), il n'existe malheureusement aucune solution existante à ma connaissance immédiatement accessible dans la bibliothèque standard pour le faire.
Néanmoins, c'est assez facile à faire : il suffit de convertir les deux chaînes en majuscules (ou les deux en minuscules - j'ai choisi majuscules dans cet exemple).
std::string upper_string(const std::string& str)
{
string upper;
transform(str.begin(), str.end(), std::back_inserter(upper), toupper);
return upper;
}
std::string::size_type find_str_ci(const std::string& str, const std::string& substr)
{
return upper(str).find(upper(substr) );
}
Ce n'est pas une solution rapide (frôlant le territoire de la pessimization) mais c'est la seule que je connaisse de façon immédiate. Il n'est pas non plus très difficile d'implémenter votre propre recherche de sous-chaîne insensible à la casse si vous vous préoccupez de l'efficacité.
De plus, j'ai besoin de prendre en charge std::wstring/wchar_t. Des idées ?
tolower/toupper en locale fonctionnera également sur les chaînes larges, donc la solution ci-dessus devrait être tout aussi applicable (il suffit de changer std::string en std::wstring).
[Edit] Une alternative, comme indiqué, est d'adapter votre propre type de chaîne insensible à la casse à partir de basic_string en spécifiant vos propres traits de caractère. Cela fonctionne si vous pouvez accepter que toutes les recherches de chaînes, les comparaisons, etc. soient insensibles à la casse pour un certain type de chaîne donné.
1 votes
Il y a un Gotw sur ce sujet très précis : gotw.ca/gotw/029.htm
1 votes
Stristr n'est pas là, mais "char *strcasestr(const char *haystack, const char *needle);" est là. N'est-ce pas correct?
0 votes
@Nasir,
strcasestr
n'est pas disponible sous Windows.