Bonjour,
Une question d' un examen de C de mon école est celle-ci:
"Soit un vecteur de pointeurs pointant vers des noms de personnes et
un vecteur d’entiers de même taille.
Fonction qui transforme en majuscule le ième caractère de chaque chaine (i étant pris dans le vecteur d’entiers)."
J'ai voulu la résoudre, mais j'ai une erreur de segmentation dans la fonction maj() au niveau de la fonction tolower() pour la version avec les bibliothèques standards et au niveau de la fonction min2maj() pour la version avec les fonctions que l'on a dû réécrire en cours (comme puts, tolower).
J'ai testé ces fonctions sur une chaine simple (non pointée par un vecteur de pointeurs) et ça fonctionne . J'ai lu les tuto's mais ça n'éclaire pas ma lanterne, quelqu'un voit-il où est le problème?
les codes:
version fonctions perso's
version fonctions standards:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 /* examen 1 ere session 2004-2005 - q.1 - Soit un vecteur de pointeurs pointant vers des noms de personnes et un vecteur dentiers de même taille. Fonction qui transforme en majuscule le ième caractère de chaque chaine (i étant pris dans le vecteur dentiers). date: 20/08/08 */ #include <stdio.h> #include <string.h> void min2maj (char *c); void maj (char **tab, short *vi, int t); //void maj2 (char *tab[], int t); test d'ecriture du parametre void pputs (char *ch, short t); void aff_vect (char **tab, int t); main() { static char *vs[]={"alain", "marie-anne", "emmanuelle"}; static short ve[]={2, 6, 12}; aff_vect(vs, 3); maj(vs, ve, 3); //maj2(vs, 3); printf("vecteur apres transformation:\n"); aff_vect(vs, 3); } void min2maj (char *c) { if((*c>='a') && (*c<='z')) *c-= 32; } void maj (char **tab, short *vi, int t) { int i, j=0; for(i=0; i<t; i++) { while((j< *(vi+i))&&(*(*(tab+i)+j))) j++; if((*(*(tab+i)+j)== '\0')) printf("chaine trop courte\n"); else min2maj((*(tab+i)+j)); } } /*void maj2 (char *tab[], int t) { char *p=tab[2]; min2maj(p); }*/ void pputs (char *ch, short t) { while (*ch) { putchar(*ch++); // prend ce qu' il y a dans la variable pointee, puis incremente le pointeur ch } putchar('\n'); } void aff_vect (char **tab, int t) { int i; for(i=0; i<t; i++) pputs(*(tab+i), t); }
D'avance merci,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 /* examen 1 ere session 2004-2005 - q.1 - Soit un vecteur de pointeurs pointant vers des noms de personnes et un vecteur dentiers de même taille. Fonction qui transforme en majuscule le ième caractère de chaque chaine (i étant pris dans le vecteur dentiers). version avec fonctions standards date: 20/08/08 */ #include <stdio.h> #include <string.h> #include <ctype.h> void maj (char **tab, short *vi, int t); void aff_vect (char **tab, int t); main() { static char *vs[]={"alain", "marie-anne", "emmanuelle"}; static short ve[]={2, 6, 12}; aff_vect(vs, 3); maj(vs, ve, 3); printf("vecteur apres transformation:\n"); aff_vect(vs, 3); } void maj (char **tab, short *vi, int t) { int i, j=0; for(i=0; i<t; i++) { while((j< *(vi+i))&&(*(*(tab+i)+j))) j++; if((*(*(tab+i)+j)== '\0')) printf("chaine trop courte\n"); else *(*(tab+i)+j)=toupper(*(*(tab+i)+j)); } } void aff_vect (char **tab, int t) { int i; for(i=0; i<t; i++) puts(*(tab+i)); }
ps:
J'utilise gcc 4.0 sous linux.
Partager