Comment convertir une chaîne de caractères mixte en une chaîne de caractères minuscule en C ?
for ( ; *p; ++p) *p = tolower(*p);
semble plus idiomatique.
Comment convertir une chaîne de caractères mixte en une chaîne de caractères minuscule en C ?
Elle se trouve dans la bibliothèque standard, et c'est la manière la plus directe que je puisse voir pour mettre en œuvre une telle fonction. Donc oui, il suffit de faire une boucle dans la chaîne et de convertir chaque caractère en minuscule.
Quelque chose de banal comme ceci :
#include <ctype.h>
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
ou si vous préférez les one liners, vous pouvez utiliser celui de J.F. Sebastian :
for ( ; *p; ++p) *p = tolower(*p);
@J.F. voilà. Cela dépend s'ils veulent que le code soit effrayant ou agréable :) (très lisible, mais qui fait peur)
Cela me donne un défaut de segmentation si str est un char *
mais pas si str est un tableau de caractères. Vous avez une explication à cela ?
Pour le rendre un peu plus lisible, vous pourriez faire ce qui suit for(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
Cette version est en fait plus lente que celle de la glibc tolower()
. 55.2 contre 44.15 sur ma machine.
Je ne peux pas imaginer cela : tolower() traite les caractères ; seulement s'il s'agit d'une macro
Si vous avez besoin d'un support Unicode pour la fonction minuscule, consultez cette question : Bibliothèque Unicode en C léger
Si nous devons être aussi négligents que d'utiliser des tolower()
Faites-le :
char blah[] = "blah blah Blah BLAH blAH\0";
int i = 0;
while( blah[i] |=' ', blah[++i] ) {}
Mais, bon, il explose en quelque sorte si vous lui donnez des symboles/chiffres, et en général, il est diabolique. Bonne question pour l'entretien, cependant.
Oui, cela va plier/filer/mutiler toute une série de symboles (en ASCII, tout symbole, caractère de contrôle ou chiffre dont le bit 5 est vide deviendra le même code de caractère dont le bit 5 est défini, etc).
Pouvez-vous nous en dire plus ? Quand je lis des articles sur tolower(), ils mentionnent tous qu'ils ne fonctionnent que sur les caractères qui ont un caractère minuscule défini pour eux. D'après opengroup.org : "Si l'argument de tolower() représente une lettre majuscule et qu'il existe une lettre minuscule correspondante [CX] [Option Start] (telle que définie par les informations sur le type de caractère dans la catégorie locale du programme LC_CTYPE ), [Option End] le résultat sera la lettre minuscule correspondante. Tous les autres arguments du domaine sont renvoyés inchangés". Si tel est le cas, où se situe l'échec de tolower() ?
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
S'agit-il uniquement de l'ASCII avec les lettres a-z ?
1 votes
Ascii. comment en tenir compte ? l'exemple ci-dessous fonctionnerait-il toujours ? que se passe-t-il si mon caractère est un '#' et que tolower() est appelé sur lui ?
1 votes
Cela fonctionnera. Je pensais plutôt à une chaîne de caractères contenant des éléments tels que é ou Ü.
4 votes
Pourquoi ne pas utiliser "strlwr" ?
strlwr((char*)str);
Il passe simplement par la chaîne et la convertit lui-même.1 votes
@Larry Ce n'est pas une norme.