144 votes

Comment mettre une chaîne de caractères en minuscules en C ?

Comment convertir une chaîne de caractères mixte en une chaîne de caractères minuscule en C ?

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 Ü.

209voto

Earlz Points 19355

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);

43 votes

for ( ; *p; ++p) *p = tolower(*p); semble plus idiomatique.

16 votes

@J.F. voilà. Cela dépend s'ils veulent que le code soit effrayant ou agréable :) (très lisible, mais qui fait peur)

1 votes

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 ?

9voto

Oleg Razgulyaev Points 2140

Pour convertir en minuscules équivaut à lever le bit 0x60 si vous vous limitez à l'ASCII :

for(char *p = pstr; *p; ++p)
    *p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;

7 votes

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;

8 votes

Cette version est en fait plus lente que celle de la glibc tolower() . 55.2 contre 44.15 sur ma machine.

0 votes

Je ne peux pas imaginer cela : tolower() traite les caractères ; seulement s'il s'agit d'une macro

7voto

cscan Points 76

Boucler le pointeur pour obtenir de meilleures performances :

#include <ctype.h>

char* toLower(char* s) {
  for(char *p=s; *p; p++) *p=tolower(*p);
  return s;
}
char* toUpper(char* s) {
  for(char *p=s; *p; p++) *p=toupper(*p);
  return s;
}

0 votes

Si vous optez pour une seule ligne, alors s est une variable locale dans votre fonction, vous pouvez l'utiliser directement au lieu de déclarer p .`

1voto

Eduardo Points 803

Si vous avez besoin d'un support Unicode pour la fonction minuscule, consultez cette question : Bibliothèque Unicode en C léger

1voto

Ken S Points 35

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.

7 votes

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).

1 votes

Cet article est discuté sur méta .

0 votes

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.com

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.

Powered by:

X