bonjour,
si on veut créer une fonction qui dans une chaîne de caractère, convertit les majuscules en minuscules, et les minuscules en majuscules, comment faudrait-il procéder ?
merci.
Version imprimable
bonjour,
si on veut créer une fonction qui dans une chaîne de caractère, convertit les majuscules en minuscules, et les minuscules en majuscules, comment faudrait-il procéder ?
merci.
Il faudrait lire la documentation des fonctions de la bibliothèque standard et ainsi trouver les deux fonctions qui font la conversion minuscules <-> majuscules.Citation:
si on veut créer une fonction qui dans une chaîne de caractère, convertit les majuscules en minuscules, et les minuscules en majuscules, comment faudrait-il procéder ?
Un pointeur sur la chaîne en argument de la fonction. Dans la fonction, une boucle qui parcours la chaîne caractère par caractère et pour chaque caractère, du détermine s'il est en majuscule ou minuscule avec les fonctions islower et isupper et tu fait l'opération qui va bien avec les fonctions tolower/toupper
Fait la fonction et reviens ici :mrgreen:
Dans ta fonction recevant comme parametre un pointeur sur la chaine a transformer,
Tu déclares un pointeur (char *pt)que tu initialises sur le début de ta chaîne.
si *pt est compris entre 'a' et 'z',
tu y rajoutes 'A'-'a'
sinon
si *pt est compris entre 'A' et 'Z', tu y rajoutes 'a'-'A'
tu incrémentes ton pointeur jusqu'à ce que tu rencontre le 0 de fin de chaîne.
D'ailleurs ça me fait penser que si je veux convertir un caractère représentant un chiffre ('5' par exemple) en valeur numérique correspondante (5), je fais '5' - '0' (ce qui n'est évidemment pas non plus portable puisque je suppose que les caractères '0', '1', '2', '3', '4' et '5' sont consécutifs dans la table ascii). Mais j'ai pas trouvé de fonction "normalisée" pour faire l'équivalent. Quelqu'un aurait une piste ??? (mais s'il vous plaît, ne me parlez pas de "atoi()" ou "strtoul()" comme j'ai déjà vu dans ce fofo car ces fonctions prennent en entrée des chaînes et non des char)...
Ben si, justement, c'est portable pour les chiffres décimaux (digits, ou caractères '0'-'9'), comme c'est exigé par la norme. C'est pour ça qu'il n'y a pas de fonction pour ça. L'abstraction est ici inutile.
La bibliothèque standard du C n'est pas parfaite, mais elle donne quand même un certain nombre d'indications sur les Bonnes Pratiques...
Ce n'est pas le cas pour certains codes. Voir une belle collection de vieux codes: http://homepages.cwi.nl/~dik/english/codes/.
Mais c'est plus pour l'anectode que pour autre chose. Ca n'a plus guere d'interet pratique. Et de toute facon, c'est exige par la norme C.
C'est pas écrit noir sur blanc. C'est en en prenant connaissance et en en comprenant les mécanismes de conception, et à force de l'utiliser avec un regard curieux et actif, qu'on parvient à en déduire un certain nombre de Bonnes Pratiques...
Par exemple, il n'y a pas paramètre ni de retour de type char ni short. Normal, en interne ces types sont convertis en int...
Qu'est ce qui empêche une fonction de prendre des arguments de type char ou short. Je code fonctionne parfaitement et je ne vois pas l'utilirté d'un passage par une conversion en int (même en interne):
Pourrais-tu préciser ta pensée?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h> void ma_fonction(char arg1, short arg2) { printf("arg1 = %d, sizeof arg1 = %u\narg2 = %d, sizeof arg2 = %u\n", (unsigned char) arg1, (unsigned) sizeof arg1, arg2, (unsigned) sizeof arg2); } int main(void) { char c = 'A'; short h = 100; ma_fonction(c, h); return 0; }
Thierry
Bien sûr que ça fonctionne, mais le code généré fait des conversions inutiles... C'est surtout un problème d'implémentation, mais suffisamment répandu pour que les gens qui ont écrit la bibliothèque n'aient pas jugé bon d'utiliser ces types.
D'ailleurs, les compilateurs bien réglés signalent le problème...
Code:
1
2
3 -Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes -Wuninitialized -Wunreachable-code -Wconversion
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include <stdio.h> void f (char c) { putchar (c); } void g (short c) { putchar (c); } void h (int c) { putchar (c); } void i (long c) { putchar (c); } int main (void) { f ('A'); g ('B'); h ('C'); i ('D'); return 0; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Project : Forums Compiler : GNU GCC Compiler (called directly) Directory : C:\dev\forums\ -------------------------------------------------------------------------------- Switching to target: default Compiling: main.c main.c: In function `main': main.c:25: warning: passing arg 1 of `f' with different width due to prototype main.c:26: warning: passing arg 1 of `g' with different width due to prototype Linking console executable: console.exe Process terminated with status 0 (0 minutes, 0 seconds) 0 errors, 2 warnings
Il me semblait avoir deja explique cela. Ce warning n'a de sens que dans le cadre d'une conversion d'un programme sans prototypes a l'utilisation de prototype. La raison pour laquelle la bibliotheque standard (encore que je n'ai pas verifie pour tout ce qui a ete ajoute pour c99) ne contient pas d'occurence de promotions dans les parametres, c'est que sa conception date d'avant les prototypes...
Ce serait assez bizarre de mettre -Wconversion en meme temps que -Wstrict-prototypes si l'equipe de gcc n'avait surcharge -Wconversion pour controler aussi un autre warning.