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 :

Problème bête char*


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut Problème bête char*
    Bonjour,

    J'ai un problème qui va vous paraitre bête, mais venant de Java, je n'ai jamais rencontrer ce problème......

    Je souhaite faire d'un char* un tableau afin de pouvoir en extraire les caractères 1 par 1.

    Par exemple faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char* test = "bonjour";
    ....
    char test1 = test[0]; ->caractère 'b' de "bonjour".
    J'ai regardé sur différents sites sans trouver la réponse malheureusement.


    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Quelque chose comme cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* test = "bonjour";
     
    char table[500];
       strcpy(table, test);
    Toutefois, 2 choses:
    Il faut que ton tableau "table" soit suffisemment grand pour pouvoir contenir la chaine de caractères pointée par "test". A toi de faire les contrôles avant de faire la copie (sinon, c'est le crash).

    Autre chose, "test" est un pointeur sur caractères mais tu peux aussi le considérer comme un tableau de caractères et écrire test[0], test[1], test[n], ... comme si c'était un tableau (et c'en est un).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Autre chose, "test" est un pointeur sur caractères mais tu peux aussi le considérer comme un tableau de caractères et écrire test[0], test[1], test[n], ... comme si c'était un tableau (et c'en est un).
    Non test n'est pas un tableau mais un pointeur. Le tableau, c'est "bonjour". C'est un tableau de char anonyme :

    C'est pareil que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char const *test;
    {
       static char const anonym[] = {'b', 'o', 'n', 'j', 'o', 'u', 'r', 0};
       test = anonym;
    }

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Bonjour,

    Citation Envoyé par PP(Team) Voir le message
    Par exemple faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* test = "bonjour";
    ....
    char test1 = test[0]; ->caractère 'b' de "bonjour".
    Un pointeur est implicitement un tableau, et un tableau déclaré en mémoire est accompagné d'un pointeur qui en indique le début. Ton code est donc tout-à-fait valide et peut être exploité comme tel (il est quand même préférable de déclarer char test1 au préalable, puis de l'exploiter ensuite).

    À bientôt.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,



    Un pointeur est implicitement un tableau, et un tableau déclaré en mémoire est accompagné d'un pointeur qui en indique le début. Ton code est donc tout-à-fait valide et peut être exploité comme tel.

    À bientôt.
    quand je fais cela et que j'affiche la valeur, ca me met.....rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("t1 = %s \n",t1);
    affiche
    t1 = ""


    Réponse à ram-0000 :


    J'ai testé, ca me rempli bien le tableau avec le char*, mais quand je fais cela, ca ne m'affiche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char table[mystrlen(test)];
        strcpy(table, test);
     
        printf("table = %s \n", table);
        printf("table[1] = %s \n",table[1]);
    affiche :
    table = 0001200302312000 ->c bon
    table[1] = "" -> :'(
    NB : mystrlen(test) me renvoie la taille du char*.

  6. #6
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par PP(Team) Voir le message
    J'ai testé, ca me rempli bien le tableau avec le char*, mais quand je fais cela, ca ne m'affiche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char table[mystrlen(test)];
        strcpy(table, test);
     
        printf("table = %s \n", table);
        printf("table[1] = %s \n",table[1]);
    affiche :
    table = 0001200302312000 ->c bon
    table[1] = "" -> :'(

    NB : mystrlen(test) me renvoie la taille du char*.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char table[mystrlen(test)];
    est faux étant donné le strcpy qui suit - à moins que le nom de fonction ait été mal choisi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char table[mystrlen(test) + 1];
    serait correct, car il faut prendre en compte le caractère de fin de chaîne. Cependant, je préfère éviter d'utiliser des tableaux de taille variable car c'est une fonctionnalité C99 et je préfère rester conforme au C89 en général.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("table[1] = %c \n",table[1]);
    devrait mieux fonctionner.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Merci, cela fonctionne.
    Le problème d'affichage vient du fait que j'affichais un char avec %s et non pas %c.....Pas très intelligent le C :p

    Pour la question du +1, je ne sais pas, voici le code que g récupéré et qui me permet en fait de récupérer la longueur du contenu du char*.
    Je pense effectivement que je vais devoir rajouter 1. Comme ma chaine contient 290 éléments, je v donc devoir créer une chaine de 291 élémets.

    Merci à tous.

  8. #8
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par PP(Team) Voir le message
    Pas très intelligent le C :p
    En fait, le C suppose que le programmeur est intelligent.
    Il faut juste faire attention. Je suis d'accord que certaines choses peuvent dérouter quand on passe du java au C. En C, il faut avoir de bonnes bases et savoir ce que l'on fait.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par PP(Team) Voir le message
    Merci, cela fonctionne.
    Le problème d'affichage vient du fait que j'affichais un char avec %s et non pas %c.....Pas très intelligent le C
    Arf, pas très intelligent le programmeur qui ne sait pas ce qu'il fait...

  10. #10
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Un pointeur est implicitement un tableau, et un tableau déclaré en mémoire est accompagné d'un pointeur qui en indique le début.
    Ce n'est pas tout a fait vrai, même si le nom d'un pointeur peut être utilisé comme un tableau. ou si le nom d'un tableau peut être assimilé à un pointeur.

    Un tableau déclaré en mémoire n'est pas accompagné d'un pointeur. le nom du tableau represente seulement une adresse (celle du debut du tableau) qui peut être retournée en utilisant seulement son nom (sans l'op & adresse de).
    Un pointeur est une variable qui contient une adresse et rien d'autre.

  11. #11
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("table[1] = %s \n",table[1]);
    %s sert à afficher une chaîne de caractères (un tableau de caractères terminé par la valeur '\0'). L'argument attendu est l'adresse du début de la chaîne. Donc ici, il prend le caractère table[1] comme adresse et va dans les décors.
    Utilise %c.

    Accessoirement, je te rappelle que les tableaux en C commencent à l'indice 0. Donc ici, tu cherches à écrire le 2ieme caractère.

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("table[1] = %s \n",table[1]);
    %s sert à afficher une chaîne de caractères (un tableau de caractères terminé par la valeur '\0'). L'argument attendu est l'adresse du début de la chaîne. Donc ici, il prend le caractère table[1] comme adresse et va dans les décors.
    Utilise %c.

    Accessoirement, je te rappelle que les tableaux en C commencent à l'indice 0. Donc ici, tu cherches à écrire le 2ieme caractère.

    Oui oui, c'était juste pour tester, vu que ma chaine fait 290 éléments....

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    Un tableau déclaré en mémoire n'est pas accompagné d'un pointeur. le nom du tableau represente seulement une adresse (celle du debut du tableau) qui peut être retournée en utilisant seulement son nom (sans l'op & adresse de).
    Un pointeur est une variable qui contient une adresse et rien d'autre.
    Je viens d'essayer et c'est vrai. L'adresse du pointeur de tableau et son contenu correspondent tout deux à celle du premier élément. La dernière fois que j'avais essayé (il y a trèèès longtemps), j'avais obtenu le tableau + le pointeur en tant que variable distincte ...

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Je viens d'essayer et c'est vrai. L'adresse du pointeur de tableau et son contenu correspondent tout deux à celle du premier élément. La dernière fois que j'avais essayé (il y a trèèès longtemps), j'avais obtenu le tableau + le pointeur en tant que variable distincte ...
    Impossible. C'est comme ça depuis les débuts du C.

    Je ne nie pas ton expérience du C, mais elle me fait un peu penser à la mienne en 1999, quand j'ai commencé à fréquenter les forums Usenet fclc et clc.

    Purée, la claque que je me suis pris ! Surtout que là-bas, c'est pas comme ici, ils ne prennent pas gants !

    En fait, il y a beaucoup de choses qu'on croit savoir parce qu'on les a validées par l'expérience, mais il manque souvent les bases que l'on a occulté en démarrant... Un petit retour sur ces bases ne fait pas de mal. Une lecture de la norme (et ou du Rationale) non plus...

    http://emmanuel-delahaye.developpez.com/notes.htm#norme

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Impossible. C'est comme ça depuis les débuts du C. Je ne nie pas ton expérience du C, mais elle me fait un peu penser à la mienne en 1999, quand j'ai commencé à fréquenter les forums Usenet fclc et clc.
    Je ne nie pas ça. C'est un peu aussi pour cela que je fréquente ce forum.

    Par contre, en l'occurence, ce n'était pas un mensonge : c'est un problème auquel j'ai été confronté très vite, comme tout le monde, et donc j'avais fait le test à ce moment. Alors évidemment, c'était peut-être dans un contexte spécial, avec des choses de toute évidence omises ici, mais ce n'était pas une façon de se rattrapper aux branches.

    D'habitude, je garde une trace de tous les tests dans un répertoire spécial avec la date et le contexte en début de fichier, spécialement pour tirer au clair ces cas-là, quand je me trompe. Pour ce cas précis, je crains que ce ne soit trop vieux.

    Purée, la claque que je me suis pris ! Surtout que là-bas, c'est pas comme ici, ils ne prennent pas gants !
    Oui, je me suis ridiculisé aussi plusieurs fois aussi. Par contre, je t'avoue que je ne suis pas faché de poster à un endroit où la réserve et la courtoisie sont encore d'usage, parce qu'au bout d'un moment, on finit par devenir soi-même mauvais. C'est ce qui s'est passé sur ABCÉlectronique, par exemple. C'est resté un forum très propre pendant longtemps et aujourd'hui, c'est à peine si les débutants peuvent encore y mettre les pieds.

    En fait, il y a beaucoup de choses qu'on croit savoir parce qu'on les a validées par l'expérience, mais il manque souvent les bases que l'on a occulté en démarrant... Un petit retour sur ces bases ne fait pas de mal. Une lecture de la norme (et ou du Rationale) non plus...
    Il y a aussi beaucoup de choses que l'on croit maîtriser ad vitam parce qu'on l'a fait une fois, et que l'on finit par perdre sans s'en rendre compte. On peut être sûr de soi en toute bonne foi, et les forums se révèlent ici très utiles. On expose les deux points de vue, on vérifie dans la norme, on teste et on se rend à l'évidence. Même remède, donc.


    Pour Code::Blocks, par contre, j'ai posté trop vite, effectivement. Je ne l'utilise jamais, et ayant navigué dans de nombreux onglets, entre les VC++ et compagnie, je me suis persuadé en écrivant que c'était un compilo, alors que j'ai encore le tarball des sources sur mon bureau. Mea culpa, pas d'excuse.

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Un pointeur est implicitement un tableau,
    Non.
    et un tableau déclaré en mémoire est accompagné d'un pointeur qui en indique le début.
    Non. Confusions classiques qu'il va falloir une fois de plus expliquer et combatre... Je fatigue...
    Ton code est donc tout-à-fait valide et peut être exploité comme tel
    Oui, parce que l'accès à une donnée pointée par un pointeur ou appartenant à un tableau peut se faire selon 2 méthodes.

    La méthode pointeur : *(p + i) ou la méthode tableau : p[i]. Relire ses cours de C...

    http://emmanuel-delahaye.developpez....es.htm#tableau

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par PP(Team) Voir le message
    Je souhaite faire d'un char* un tableau afin de pouvoir en extraire les caractères 1 par 1.

    Par exemple faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char* test = "bonjour";
    ....
    char test1 = test[0]; ->caractère 'b' de "bonjour".
    Ce code est valide.

    char * est un pointeur, mais ici, il pointe sur un tableau 'en dur' -non modifiable : préférer char const * pour être cohérent) que tu peux lire via ce pointeur, avec la syntaxe pointeur : *(test + i) ou avec la syntaxe tableau test[i]. Pas besoin de tableau intermédiare tant qu'il s'agitde lire.

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

Discussions similaires

  1. Problème avec char
    Par choupinette116 dans le forum Débuter
    Réponses: 7
    Dernier message: 23/04/2008, 10h30
  2. Problème Cast char* en std::string
    Par inovah dans le forum SL & STL
    Réponses: 1
    Dernier message: 30/10/2007, 16h32
  3. Classe clavier problème avec char
    Par benjiprog dans le forum Langage
    Réponses: 30
    Dernier message: 30/06/2006, 16h04
  4. [C#] Problème bête avec le combo
    Par irnbru dans le forum Windows Forms
    Réponses: 4
    Dernier message: 01/03/2006, 16h40
  5. [C#] Problème de char[]
    Par GlorfindelHebril dans le forum Windows Forms
    Réponses: 11
    Dernier message: 01/04/2005, 14h56

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