CONVERTION D'UNE CHAINE DE MJUSCULE EN MINUSCULE ET VICE VERSA
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
7 juin 2004 à 09:43
StanOfSky
Messages postés43Date d'inscriptionmardi 30 mars 2004StatutMembreDerniè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.
StanOfSky
Messages postés43Date d'inscriptionmardi 30 mars 2004StatutMembreDerniè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és46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 novembre 2004 9 juin 2004 à 09:23
exact, merci à toi alca06, j'utilise plutot ta fonction que la mienne maintenant :)
alca06
Messages postés7Date d'inscriptionlundi 7 juin 2004StatutMembreDernière intervention27 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és51Date d'inscriptionlundi 7 juin 2004StatutMembreDernière intervention15 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és43Date d'inscriptionmardi 30 mars 2004StatutMembreDerniè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és7Date d'inscriptionlundi 7 juin 2004StatutMembreDernière intervention27 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)
kod32
Messages postés46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 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és43Date d'inscriptionmardi 30 mars 2004StatutMembreDerniè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és46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 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és7Date d'inscriptionlundi 7 juin 2004StatutMembreDernière intervention27 juin 2004 8 juin 2004 à 09:16
StanOfSky
Messages postés43Date d'inscriptionmardi 30 mars 2004StatutMembreDerniè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és51Date d'inscriptionlundi 7 juin 2004StatutMembreDernière intervention15 juillet 2005 7 juin 2004 à 19:02
il y a aussi quelque chose que je déplore : les accents passent mal.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és43Date d'inscriptionmardi 30 mars 2004StatutMembreDerniè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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
10 juin 2004 à 01:17
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?
9 juin 2004 à 09:23
9 juin 2004 à 08:43
"strlwr" et "strupr" existe déjà ainsi que "tolower" et "toupper" comme nous l'explique kod32... C'est seulement pour le fun.
8 juin 2004 à 23:09
8 juin 2004 à 21:48
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...
8 juin 2004 à 18:31
// 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);
}
8 juin 2004 à 17:40
8 juin 2004 à 17:28
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)
++
8 juin 2004 à 10:17
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...
8 juin 2004 à 09:16
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;
}
8 juin 2004 à 00:00
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 ;)
7 juin 2004 à 19:02
7 juin 2004 à 13:34
L'algo avec crochet utilisera un registre de plus pour l'iterateur, c'est toujours moins performant que des pointeurs.
7 juin 2004 à 13:23
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....
7 juin 2004 à 11:21
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;
}
7 juin 2004 à 10:57
"tu dois remplir pStr en utilisant 2 pointeurs, rien de plus" <-- pas trop pigé
7 juin 2004 à 10:43
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;
7 juin 2004 à 10:19
7 juin 2004 à 09:43
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.