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

  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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    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 487
    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.

  4. #4
    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*.

  5. #5
    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.

  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
    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.

  8. #8
    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.

  9. #9
    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....

  10. #10
    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.

  11. #11
    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 stephl Voir le message
    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.
    C'est mon problème, c'est que certains détails du C me manquent, j'apprends de jour en jour .
    En même temps, j'ai CodeBlocks pour compiler, c'est pas le meilleur pour ce qui est de retranscrire les erreurs, m'enfin, je vais m'y habituer.

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    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 487
    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 ...

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    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 487
    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 :p
    En l'occurence, ce n'est pas le C, le fautif : tu utilises une fonction qui formatte son affichage en fonction d'une consigne qu'elle lit dans une chaîne. Le problème serait exactement le même en Java.

    Citation Envoyé par PP(Team) Voir le message
    C'est mon problème, c'est que certains détails du C me manquent, j'apprends de jour en jour .
    Le problème est que Java est un bon langage mais que la plupart des programmeurs débutants, aujourd'hui, le choisissent pour de mauvaises raisons, la première d'entre elles étant généralement : « Java, c'est comme le C, mais sans les pointeurs. Ouf ! ».

    En même temps, j'ai CodeBlocks pour compiler, c'est pas le meilleur pour ce qui est de retranscrire les erreurs, m'enfin, je vais m'y habituer.
    Essaie autre chose, comme gcc ou MinGW.

  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 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.

  15. #15
    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;
    }

  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
    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...

  18. #18
    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
    C'est mon problème, c'est que certains détails du C me manquent, j'apprends de jour en jour .
    Ca ne s'impprovise pas. Il faut rigueur et méthode.
    En même temps, j'ai CodeBlocks pour compiler, c'est pas le meilleur pour ce qui est de retranscrire les erreurs, m'enfin, je vais m'y habituer.
    Ah oui, et c'est quoi le meilleur ? Tu l'as configuré correctement ?

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

  19. #19
    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

  20. #20
    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
    Essaie autre chose, comme gcc ou MinGW.
    Euh, étant donné que

    1 - MinGW est le compilateur par défaut de Code::Blocks
    2 - MinGW est le portage de gcc sous Windows

    Qu'est-ce que ça va changer ?

    C'est la configuration du compilateur qu'il faut adapter.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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