IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

changer un caractère dans des chaînes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut 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 : 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 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).            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 : 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 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).            
    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.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Tes fonctions sont utilisées sur des chaînes littérales, qui sont dans une zone mémoire constante.

    Puisque tu bosses sous gcc, ajoute l'option -Wwrite-strings pour donner aux chaînes de caractère la constance qu'elles ont en vrai.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ce tableau de pointeurs pointe vers des chaînes non-modifiables : Tenter de modifier le contenu de ces chaînes donne un comportement indéterminé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static char *vs[]={"alain", "marie-anne", "emmanuelle"};
    Dans ce problème, il faut que les pointeurs pointent sur des chaînes modifiables :
    La chaîne : ne l'est pas et on devrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * c1 ="alain"
    la chaîne : est modifiable.

    Remarques :
    Pouquoi ve et vs sont-ils déclarés static ?
    s'écrit plus simplement comme :

Discussions similaires

  1. Récupérer des caractères dans une chaîne
    Par LoiL Reborn dans le forum Débuter
    Réponses: 9
    Dernier message: 05/05/2008, 08h46
  2. Réponses: 2
    Dernier message: 24/03/2008, 23h00
  3. Changer un caractère dans une chaîne contenue dans une phrase
    Par cirtey dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/03/2007, 16h16
  4. Changer chaque caractère d'une chaîne
    Par YanK dans le forum Langage
    Réponses: 13
    Dernier message: 08/07/2005, 19h01
  5. [String] Remplacement caractères dans une chaîne
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 4
    Dernier message: 19/07/2004, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo