CONVERTION D'UNE CHAINE DE MJUSCULE EN MINUSCULE ET VICE VERSA

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 7 juin 2004 à 09:43
StanOfSky Messages postés 43 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 7 octobre 2006 - 10 juin 2004 à 01:17
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23462-convertion-d-une-chaine-de-mjuscule-en-minuscule-et-vice-versa

StanOfSky Messages postés 43 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 7 octobre 2006
10 juin 2004 à 01:17
mais ya pas de fonction STANDART qui permette de transformer un string en minuscule ou majuscule... tolower et touper fonctionnent sur un caractere et non pas une suite de caracteres(un string)
et strlwr strupr sont pas STANDART!!
mais j'avais bien compris que ct pour le fun c juste qu'il est tjrs plus interessant de faire les 2 fonctions en une : recopie et passer en min ou maj
mais ta solution est parfaitement correcte alca06

khayyam >> en quoi strncpy est moins dangereux?? parce qu'il ne recopie uniquement si de la place est allouée à la destination?
kod32 Messages postés 46 Date d'inscription mercredi 5 mai 2004 Statut Membre Dernière intervention 13 novembre 2004
9 juin 2004 à 09:23
exact, merci à toi alca06, j'utilise plutot ta fonction que la mienne maintenant :)
alca06 Messages postés 7 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 27 juin 2004
9 juin 2004 à 08:43
Ca n'est pas moi qui cherche a réinventer la roue...
"strlwr" et "strupr" existe déjà ainsi que "tolower" et "toupper" comme nous l'explique kod32... C'est seulement pour le fun.
cs_khayyam Messages postés 51 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 15 juillet 2005
8 juin 2004 à 23:09
euh, juste pour préciser les choses, il est préféable d'utiliser strncpy plutôt que strcpy, pour des raisons de sécurité. elle est tout aussi standard.
StanOfSky Messages postés 43 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 7 octobre 2006
8 juin 2004 à 21:48
ya strcpy fonction standart qui existe (ca ne sert à rien de réinventer la roue surtout qd celle ci devient moins optimisée :p)
autant faire une fonction qui recopie et passe en minuscule ou maj comme l'a fait BruNews ou moi meme ;)
sinon a part ca je kiffe bien ton style un peu illisible :p
le while (*s) c stylé mais peu comprenhensible pour un débutant...
alca06 Messages postés 7 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 27 juin 2004
8 juin 2004 à 18:31
// Comme ceci on garde la version originale du texte...
// et ça fonctionne trés bien compilé sous DEV-CPP (WIN32)

#include <stdio.h>

char *StringLwr(char *s);
char *StringUpr(char *s);
char *StringCpy(char *, const char *);

int main() {
char text[] = "Ceci Est Mon Texte: "Hello World!"";
char buf[64] = "\0";

StringCpy(buf, text);
printf("%s\n", buf);
printf("%s\n", StringLwr(buf));
printf("%s\n", StringUpr(buf));
printf("%s\n", text);
return 0;
}

char *StringLwr(char *s) {
char *p = s;
while (*s) {
if ((*s >= 'A')&&(*s <= 'Z'))
*s += 'a'-'A';
s++;
}
return p;
}

char *StringUpr(char *s) {
char *p = s;
while (*s) {
if ((*s >= 'a') && (*s <= 'z'))
*s += 'A'-'a';
s++;
}
return p;
}

char *StringCpy(char *pstr, const char *pfrom) {
char *p = pstr;
for ( ; *pstr = *pfrom; ++pfrom, ++pstr)
continue;
return (p);
}
kod32 Messages postés 46 Date d'inscription mercredi 5 mai 2004 Statut Membre Dernière intervention 13 novembre 2004
8 juin 2004 à 17:40
et au niveau de la mémoire, après l'utilisation d'une fonction comme celle de alca06, faut pas libérer tout ça ?
StanOfSky Messages postés 43 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 7 octobre 2006
8 juin 2004 à 17:28
ta fonction modifie la source alca06 donc apres utilisation tu n'as pu la version avec maj et min...
je vois pas trop l'interet de définir un char *p.... suffit de faire return s;
oups correction : dest[i] est equivalent à *(dest+i) non pas a dest+i

kod32 >> pour les incrementation de pointeur faut faire attention parce dest++ n'est pas forcement equivalent à dest = dest+1;, ca depend du format de dest
dest++ equivalent à dest+sizeof(le type pointé par dest)

++
kod32 Messages postés 46 Date d'inscription mercredi 5 mai 2004 Statut Membre Dernière intervention 13 novembre 2004
8 juin 2004 à 10:17
merci, grace à ça je viens de piger un peu mieux l'utilisation des poiteurs (pour plus coder en basic comme dit BruNews ;))
Je ne savais pas qu'on pouvait parcourir tous les octets un par un d'un pointés avec une incrémentation de ce type...
alca06 Messages postés 7 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 27 juin 2004
8 juin 2004 à 09:16
Ceci fonctionne normallement pas mal...

char *StringLwr(char *s)
{ char *p = s;
while (*s) {
if ((*s >= 'A')&&(*s <= 'Z'))
*s += 'a'-'A';
s++;
}
return p;
}

char *StringUpr(char *s)
{ char *p = s;
while (*s) {
if ((*s >= 'a') && (*s <= 'z'))
*s += 'A'-'a';
s++;
}
return p;
}
StanOfSky Messages postés 43 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 7 octobre 2006
8 juin 2004 à 00:00
pour les accents, fau rajouter 2-3 conditions ;)

ce que je voulais dire pour les crochets c que dest[i] est equivalent à dest+i mais bien plus lisible je trouve
j'ai raté i parce que dans ma déclaration j'ai const char *src donc je peu po modifier src ;)

quitte à corriger, autant montrer la bonne maniere ;) et casser ce cahier des charges un peu tordu ;)
cs_khayyam Messages postés 51 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 15 juillet 2005
7 juin 2004 à 19:02
il y a aussi quelque chose que je déplore : les accents passent mal.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 juin 2004 à 13:34
La memoire est desallouee par l'appelant, voir plus haut. C'etait le cahier des charges, bien entendu que je ne ferais pas un prog avec des allocs de ce genre. Comme tu le dis, on fournit le buffer cible.
L'algo avec crochet utilisera un registre de plus pour l'iterateur, c'est toujours moins performant que des pointeurs.
StanOfSky Messages postés 43 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 7 octobre 2006
7 juin 2004 à 13:23
ou kelle est désalouée la mémoire du pbuff??
fau penser à désalouer la mémoire apres chaque utilisation...
perso je ferai pas comme ca

void toMAJ(const char *src, char *dest)
{
int i = 0;
while (src[i] != '\0')
{
if (src[i] >= 'a' && src[i] <= 'z')
dest[i] = src[i]-32;
else
dest[i] = src[i];
i++;
}
dest[i] = '\0';
}

comme ca pas besoin de s'embeter et de ralentir la fonction avec des allocations mémoires. il faut passer 2 zones mémoires allouée src et dest...
c comme ca que sont implémentées les fonctions standarts de la stdio.h ou string.h etc...
on peu renvoyer autre chose qu'un void si ya possibilité d'erreur dans la fonction

au lieu de mettre des ++ partout sur les pointeurs, je trouve les crochets tout de meme un peu plus lisibles....
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 juin 2004 à 11:21
for n'est pas du vb, c'est la methode de parcours employee ici qui l'est.


char* MinMaj(char *psz)
{
char *pbuff, *d, c;
pbuff = (char*) malloc(strlen(psz) + 1);
if(pbuff) { // VERIF SI ALLOC REUSSIE OU NON !!!
d = pbuff;
while(c = *psz) {
if((c >= 'a') && (c <= 'z')) c -= 32;
*d++ = c; psz++;
}
*d = c; // LE ZERO FINAL EST INSERE ICI
}
return pbuff;
}
kod32 Messages postés 46 Date d'inscription mercredi 5 mai 2004 Statut Membre Dernière intervention 13 novembre 2004
7 juin 2004 à 10:57
j'ai fais quelques modif, par contre je suis pas d'accord sur le fait que for soit du VB, c'est pratique et courant en C, pourquoi s'en priver...
"tu dois remplir pStr en utilisant 2 pointeurs, rien de plus" <-- pas trop pigé
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 juin 2004 à 10:43
char *pStr = (char *)malloc(len); // ici ok
if(pStr) { // achtung, pourrait etre NULL
// for(i = ..... A BANNIR, c'est du VB

tu dois remplir pStr en utilisant 2 pointeurs, rien de plus

}
// string = pStr; INUTILE
return pStr;
kod32 Messages postés 46 Date d'inscription mercredi 5 mai 2004 Statut Membre Dernière intervention 13 novembre 2004
7 juin 2004 à 10:19
heu, j'ai pas bien pigé la modif que tu attends ?! tu peux m'éclairer un peu stp ? merci
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 juin 2004 à 09:43
Salut,

memset inutile pour ce traitement.
Desole de te dire que c'est code a la 'VB', un iterateur pour parcourir une chaine est inutile.
Mets un pointeur sur pStr et 1 sur string, tu elimineras sprintf,buf[2] et strcat. C'est pas rien, non ?
Allez, on attend la MAJ de cette source avec les 2 fonctions codees en C comme il se doit.

Bosse bien.
Rejoignez-nous