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 :

modification tableau de char


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Par défaut modification tableau de char
    Bonjour a tous,je suis en C++ et j'ai une question qui peut paraitre un peu stupide, mais j'y planche depuis plus d'une heure et je n'ai trouvé aucune solution..

    Pourquoi je ne peux pas modifier ceci et comment faire pour que ça fonctionne ? Merci d'avance !

    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
    #include <iostream>
    using namespace std;
     
    int main()
    {
        cout << "Hello world!" << endl;
     
     
    char *tab4[]={"hehey","babao"};
    cout <<tab4[1][3]<<endl;
    tab4[1][3] = 'f';  //le programme compile, mais plante ici
    cout <<tab4[1][3]<<endl;
     
        return 0;
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Hello

    Le problème qui se pose est que tu initialise un tableau de char* avec char const* (les chaînes écrites en dur). Le compilateur laisse faire mais tu devrais avoir un warning. Ces données sont stockées dans le read only data segment de l'exécutable, et par conséquent, sont protégées de l'écriture par l'OS.

    Valgrind ne s'y trompe pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ==12857== Process terminating with default action of signal 11 (SIGSEGV): dumping core
    ==12857==  Bad permissions for mapped region at address 0x400A86
    ==12857==    at 0x400953: main (in /tmp/a.out)
    Ceci fonctionne:

    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
    #include <iostream>
    #include <cstring>
    using namespace std;
     
    int main() {
      char const *tab[]={"hehey","babao"};
      cout << "Hello world!" << endl;
      char tab4[][4]={{},{}};
      ::strncpy(tab4[0],tab[0],4);
      ::strncpy(tab4[1],tab[1],4);
      cout <<tab4[1][3]<<endl;
      tab4[1][3] = 'f';
      cout <<tab4[1][3]<<endl;
      return 0;
    }
    Mais c'est très sale, c'est plus du C que du C++, et les chaînes ne sont pas null-terminated, le tableau n'est pas assez grand.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Par défaut
    Merci de ta réponse, et ça fonctionne effectivement, mais je n'ai pas compris ce que tu as fait, est-ce que tu pourrais détailler stp ? Car la je posais juste un exemple simple mais j'ai un plus gros problème a résoudre par derrière et je dois comprendre, merci

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Ce que j'ai fait est très simple.

    Je crée un tableau vide (mais tout de même rempli de zéros):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tab4[][4]={{},{}};
    Puis je copie le contenu des chaînes non modifiables dedans avec la fonction strncpy (préférable à strcpy car moins de riques d'overflow):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ::strncpy(tab4[0],tab[0],4); // Copie les 4 premiers caractères du premier élément de tab
    ::strncpy(tab4[1],tab[1],4); // Copie les 4 premiers caractères du 2ème élément de tab
    Le reste du code ne change pas.

    Edit: C'est mieux d'utiliser la méthode de Médinoc, je suis resté au plus proche de ton code mais ce n'est pas une bonne manière de faire.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Par défaut
    je ne connais pas les vecteurs de string, mais je vais me renseigner, merci medinoc.

    Ahh,jblecanard, tu as edit ton message non ? parce a la place de ::strncpy j'avais ::strncmp !
    Je vais essayer de resoudre mon problème et si nouvel echec je reposterai, merci a toi !

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Oui j'ai rapidement édité je ne pensais pas que tu passerais entre les les deux edit

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Franchement, tu es en C++: Pourquoi utiliser un tableau de char* quand tu peux utiliser un vecteur de strings?
    Code C++11 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include "stdafx.h"
    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;
     
    int main(void)
    {
    	cout << "Hello world!" << endl;
    	vector<string> tab4{ "hehey", "babao" };
    	cout << tab4[1][3] << endl;
    	tab4[1][3] = 'f';
    	cout << tab4[1][3] << endl;
    	return 0;
    }
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. decalage à gauche sur une tres grand tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/07/2005, 22h40
  2. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  3. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 11h51
  4. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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