changer un caractère dans des chaînes
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
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 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);
} |
version fonctions standards:
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 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));
} |
D'avance merci,
ps:
J'utilise gcc 4.0 sous linux.