Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/03/2017, à 18:44

plouf1221

Modifier une chaine de caractere passée en parametre [Résolu]

Bonjour,

Je ne suis pas un programmeur expérimenté en c, ni d'en d'autre d'ailleurs mais je cherche
à modifier une chaîne de caractere passé en paramètre à une fonction.
Cette fonction mets en majuscule les minuscule de l'alphabet caractere ASCII sans les accents bien évidement.

Je n'ai pas trouvé mieux que de faire ceci :

#include<stdio.h>                                                                                                                                                                                            
 #include<stdlib.h>
 #include<string.h>
 
 char* make_uppercase(char *word) {
     int len = strlen(word);
     char *p =  malloc(sizeof(*p) * len );
     for (int i = 0; i < len; i++)
         if ( word[i] <= 'z' && word[i] >= 'a' )
             p[i] = word[i] + 'A' -'a';
     p[len] = '\0';
     word = p;
     return word;
 }
 
 int main(int argc, char *argv[]) {
 
     char chaine[] = "bonjour";
     printf("%s", chaine);
     make_uppercase(chaine);
     printf("%s", chaine);
     return EXIT_SUCCESS;
 }

Le problème c'est que l'allocation dynamique du pointeur est permanente.
Es qu'il existe une autre manière de faire qui serai mieux avis au programmeur c qui ont de la bouteille.

En faite non même ça cela ne marche pas.
chaine ne passe pas en majuscule dans le main.

Merci pour votre temps.

Dernière modification par plouf1221 (Le 31/03/2017, à 10:47)

Hors ligne

#2 Le 30/03/2017, à 21:05

claudius01

Re : Modifier une chaine de caractere passée en parametre [Résolu]

Bonsoir,

Sauf erreur de ma part:

1) Il manque +1 dans le nombre d'octets passé au malloc() (sinon le '\0' terminal sera recopié en dehors ;-)
2) Pourquoi les 2 caractères 'a' et 'z' n'ont-ils pas le droit d'être convertis en majuscule ;-))
3) Pourquoi faire une allocation, puisque tu sembles vouloir écraser le buffer (word = p;) passé en argument de make_uppercase() (autant écrire directement dedans ;-))).
De plus, ce 'word = p;' ne fait que modifier le pointeur dans la pile et non celui qui pointe sur la chaine convertie.
Pour cela, il faut passer l'adresse du pointeur et le remplacer par celui de ladite chaine ou alors écrire dedans au moyen d'un *(word + offset) = 'char converti'...

A suivre...

Edit1: Suppression du point 2) que j'avais pourtant lu avec '<' et '>' ...
Edit2: word = p; // ?!..

Dernière modification par claudius01 (Le 30/03/2017, à 23:47)

Hors ligne

#3 Le 31/03/2017, à 08:41

pingouinux

Re : Modifier une chaine de caractere passée en parametre [Résolu]

Bonjour,
En modifiant directement la chaîne de départ, comme indiqué par claudius01 :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

 char* make_uppercase(char *word) {
     for (char*p=word;*p;++p) 
        if ( *p <= 'z' && *p >= 'a' ) *p += 'A' -'a';
     return word;
 }

 int main(int argc, char *argv[]) {

     char chaine[] = "bon-jour";
     printf("%s\n", chaine);
     printf("%s\n",  make_uppercase(chaine));
     printf("%s\n", chaine);
     return EXIT_SUCCESS;
 }

D'ailleurs, make_uppercase n'a pas besoin de retourner de valeur :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
 void make_uppercase(char *word) {
     for (char*p=word;*p;++p)
        if ( *p <= 'z' && *p >= 'a' ) *p += 'A' -'a';
 }
 
 int main(int argc, char *argv[]) {
 
     char chaine[] = "bon-jour";
     printf("%s\n", chaine);
     make_uppercase(chaine);
     printf("%s\n", chaine);
     return EXIT_SUCCESS;
 }

Hors ligne

#4 Le 31/03/2017, à 10:46

plouf1221

Re : Modifier une chaine de caractere passée en parametre [Résolu]

Merci pingouinux.

Hors ligne

#5 Le 31/03/2017, à 21:53

grigouille

Re : Modifier une chaine de caractere passée en parametre [Résolu]

Petite variante :

void make_uppercase(char *word) {
       for (char *p = word; *p ; ++p)
               *p=toupper(*p);
}
  

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#6 Le 31/03/2017, à 22:23

grigouille

Re : Modifier une chaine de caractere passée en parametre [Résolu]

Ou cette variante :

void make_uppercase(char *word) {
       for (char *p = word ; *p ; ++p)
	     if('a' <= *p && *p <= 'z') *p &= 0xdf;
    }

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne