Comment supprimer la ponctuation d’une chaîne en C

Je cherche à supprimer toute la ponctuation d’une chaîne et à mettre toutes les lettres majuscules en minuscule en C, des suggestions?

Juste un croquis d’un algorithme utilisant les fonctions fournies par ctype.h :

 #include  void remove_punct_and_make_lower_case(char *p) { char *src = p, *dst = p; while (*src) { if (ispunct((unsigned char)*src)) { /* Skip this character */ src++; } else if (isupper((unsigned char)*src)) { /* Make it lowercase */ *dst++ = tolower((unsigned char)*src); src++; } else if (src == dst) { /* Increment both pointers without copying */ src++; dst++; } else { /* Copy character */ *dst++ = *src++; } } *dst = 0; } 

Les mises en garde standard s’appliquent: Complètement non testé; raffinements et optimisations laissés comme exercice au lecteur.

Boucle sur les caractères de la chaîne. Chaque fois que vous rencontrez une ponctuation ( ispunct ), ne la copiez pas dans la chaîne de sortie. Chaque fois que vous rencontrez un “caractère alpha” ( isalpha ), utilisez tolower pour le convertir en minuscule.

Toutes les fonctions mentionnées sont définies dans

Vous pouvez le faire sur place (en conservant des pointeurs d’écriture et de lecture distincts), ou en créer une nouvelle. Mais cela dépend entièrement de votre application.

La façon idiomatique de faire cela en C consiste à avoir deux pointeurs, une source et une destination, et à traiter chaque caractère individuellement: par exemple

 #include  void reformat_ssortingng(char *src, char *dst) { for (; *src; ++src) if (!ispunct((unsigned char) *src)) *dst++ = tolower((unsigned char) *src); *dst = 0; } 

src et dst peuvent être la même chaîne car la destination ne sera jamais plus grande que la source.

Bien que cela soit tentant, évitez d’appeler tolower(*src++) car tolower peut être implémenté sous forme de macro.

Évitez les solutions qui recherchent des caractères à remplacer (en utilisant strchr ou similaire), elles transformeront un algorithme linéaire en un algorithme géomésortingque.

Voici un aperçu de la réponse pour vous:

 void ssortingp_punct(char * str) { int i = 0; int p = 0; int len = strlen(str); for (i = 0; i < len; i++) { if (! ispunct(str[i]) { str[p] = tolower(str[i]); p++; } } }