Comment puis-je convertir une chaîne de casse mixte en chaîne en minuscules en C?
strlwr((char*)str);
Il passe simplement par la chaîne et le convertit lui-même.
Comment puis-je convertir une chaîne de casse mixte en chaîne en minuscules en C?
strlwr((char*)str);
Il passe simplement par la chaîne et le convertit lui-même.
Réponses:
C'est dans la bibliothèque standard, et c'est le moyen le plus simple que je puisse voir pour implémenter une telle fonction. Alors oui, faites une boucle sur la chaîne et convertissez chaque caractère en minuscules.
Quelque chose de trivial comme ça:
#include <ctype.h>
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
ou si vous préférez une doublure, vous pouvez utiliser celle-ci de JF Sebastian:
for ( ; *p; ++p) *p = tolower(*p);
for ( ; *p; ++p) *p = tolower(*p);
semble plus idiomatique.
char *
, mais pas si str est un tableau de caractères. Vous avez une explication à cela?
convertir en minuscules équivaut à augmenter le bit 0x60 si vous vous limitez à ASCII:
for(char *p = pstr; *p; ++p)
*p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;
for(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
tolower()
. 55,2 contre 44,15 sur ma machine.
int (*)(int)
signature. Voici le code utilisé pour les mesures de performance gist.github.com/370497
Êtes-vous uniquement confronté à des chaînes ASCII et n'avez-vous aucun problème de paramètres régionaux? Alors oui, ce serait une bonne façon de le faire.
tolower()
laisse l'argument inchangé s'il n'est pas dans la plage 'A' .. 'Z'.
Si vous avez besoin de la prise en charge d'Unicode dans la fonction minuscule, consultez cette question: Bibliothèque Unicode Light C
Si nous allons être aussi bâclés à utiliser tolower()
, faites ceci:
char blah[] = "blah blah Blah BLAH blAH\0"; int i=0; while(blah[i]|=' ', blah[++i]) {}
Mais bon, ça explose un peu si vous lui donnez des symboles / chiffres, et en général c'est mal. Bonne question d'entretien, cependant.