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 :

Probleme pour mettre le 0 de fin apres un mot


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut Probleme pour mettre le 0 de fin apres un mot
    bonjour!

    j'ai quelque probleme avec les pointeurs :j'essaie de me redonner avec un pointeur ,un mot taper.

    voila mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(int argc, char* argv[])
    {
       char *s;int l;
     
       printf("donner un mot : ");
       scanf("%s",&s);
       l=(strlen(s)+1);
       s=malloc (l);s='\0';
       printf("%s",*s);
       return 0;
    }
    merci d'avance pour vos reponse!!

  2. #2
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut
    salut,

    L'opération "&s" te donne l'adresse de la case mémoire dans laquelle tu as stocké s, donc quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",&s);
    tu stockes ton string dans l'adresse de s.. s étant un pointeur, je pense que tu veux plutôt faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",*s);
    c-a-d stocker ton string dans le contenu de la variable s. Je me trompe?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Probleme pour mettre le 0 de fin apres un mot
    Citation Envoyé par Asmod_D
    bonjour!

    j'ai quelque probleme avec les pointeurs :j'essaie de me redonner avec un pointeur ,un mot taper.

    voila mon code:

    int main(int argc, char* argv[])
    paramètres non utilisés...
    {
    char *s;int l;
    pointeur non initialisé...
    printf("donner un mot : ");
    scanf("%s",&s);
    "%s" attend l'adresse du premier élement d'un tableau de char. Or tu lui donnes l'adresse d'un pointeur sur char non initialisé. Le comportement est indéfini. Ca n'a aucune chance de fonctionner. Il faut définir un tableau de char et passer le nom du tableau.

    Je n'ai pas regardé le reste...
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par agnesN7
    salut,

    L'opération "&s" te donne l'adresse de la case mémoire dans laquelle tu as stocké s, donc quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",&s);
    tu stockes ton string dans l'adresse de s.. s étant un pointeur, je pense que tu veux plutôt faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",*s);
    NON. s n'est pas initialisé. Le comportement est indéfini.
    c-a-d stocker ton string dans le contenu de la variable s. Je me trompe?
    OUI.

    Voir ma réponse dans mon post précédent...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Citation Envoyé par agnesN7
    salut,

    L'opération "&s" te donne l'adresse de la case mémoire dans laquelle tu as stocké s, donc quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",&s);
    tu stockes ton string dans l'adresse de s.. s étant un pointeur, je pense que tu veux plutôt faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",*s);
    c-a-d stocker ton string dans le contenu de la variable s. Je me trompe?
    Ca serait pas plutot
    tout simplement s étant un pointeur.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Ca serait pas plutot
    tout simplement s étant un pointeur.
    Dans le code du P.O., le pointeur n'est pas initialisé :
    Comportement indéfini.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 44
    Points
    44
    Par défaut
    perso moi je fais dans la vielle technique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *str;
    int i;
     
    i = 42;
    str = malloc(i+1 sizeof(str) );
    str[i] = '\0';
    est si tu fait un read:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nb_read = read(0, str, 42);
    str[nb_read] = '\0';
    ya pas de gestion d'erreur c un exemple

    mais apres c'est peu etre trop achehique pour toi :-D

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par leptityugi
    perso moi je fais dans la vielle technique
    <...>
    mais apres c'est peu etre trop achehique pour toi :-D
    C'est surtout une façon compliquée d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       char str&#91;43&#93;;
       int nb_read = read&#40;0, str, sizeof str - 1&#41;;
     
       str&#91;nb_read&#93; = '\0';
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 44
    Points
    44
    Par défaut
    oui c sur mes exemples son souvent brouillon :-D mais la methode est bonne

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut oui mais !!
    bonjour!

    je tiens beaucoup a vous remercier pour vos commantaires.

    je m'explique aussi tres mal: ce que je veux c'est lorsque l'on tape un mot aleatoirement :
    exemple un mot de 7 carateres ,que mon pointeur puisse prendre les 7 caracteres + le 0 de fin pour fermer le mot, apres avoir taper le mot.(sans d'initialisation du pointeur au chiffre que l'on veut).

    merci .

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: oui mais !!
    Citation Envoyé par Asmod_D
    je m'explique aussi tres mal: ce que je veux c'est lorsque l'on tape un mot aleatoirement :
    exemple un mot de 7 carateres ,que mon pointeur puisse prendre les 7
    Erreur fréquente. Un pointeur ne prend rien du tout (à par l'adresse d'un bloc mémoire). C'est le bloc pointé qui prend les caractères. Si le bloc est trop petit, le comportement est indéfini. Mais fgets() permet de ne pas déborder.
    caracteres + le 0 de fin pour fermer le mot, apres avoir taper le mot.(sans d'initialisation du pointeur au chiffre que l'on veut).
    Si j'ai bien compris, tu veux pouvoir faire une saisie d'un nombre quelquonque de caractères, c'est ça ?

    Il n'y a pas de moyen simple de le faire. C'est néanmoins faisable, mais c'est pas trivial. C'est basé sur malloc(), realloc(), une boucle, la gestion de la taille lue, de la taille du bloc... C'est un métier. Mais je peux détailler si nécessaire...

    fgets() tout seul ne te suffit pas ?
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut
    bonsoir,

    oui ,V.I.P c'est exactement ce que je veux faire . qu'un pointeur puisse saisir
    ce que je tape : Pourrai tu me donner le programme s'il te plait.

    je pense que c'est un peu hard mais je voudrais bien savoir comment on peut faire.

    merci d'avance!

    Asmod_D

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Heu son nom c'est Emmanuel Delahaye pas VIP
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Asmod_D
    oui, c'est exactement ce que je veux faire . qu'un pointeur puisse saisir ce que je tape :
    Confusion courante. Un pointeur n'est pas une sorte de mémoire élastique. C'est une variable (d'un taillle fixe) qui contient l'adresse d'un bloc de données (autre variable, bloc alloué etc.).

    http://emmanuel-delahaye.developpez.....htm#pointeurs

    Si on veut de la souplesse, il faut jouer avec l'allocation dynamique.
    Pourrai tu me donner le programme s'il te plait.
    Non. Il n'est pas question que je te donne du code tout fait. Par contre je peux te mettre sur la voie.

    En gros, on définit un bloc dynamique d'une taille 'raisonnable', puis on passe adresse et taille à fgets(). Une fois la saisie terminée, on vérifie la présence du '\n'. Si il est présent, c'est que l'ensemble de la ligne a été saisi. Si il n'est pas présent, il faut agrandir le bloc, modifier la taille, et rappeler fgets() et on recommence les tests jusqu'à ce qu'on trouve le '\n'.

    A la fin, l'ensemble de la ligne, quelque soit sa taille et si la mémoire le permet, est saisie. En cas d'erreur, tout est libéré et une indication d'erreur est signifiée.

    On peut envisager une fonction get_line() comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char *get_line&#40;void&#41;
    &#123;
       char *s = /* a completer */
     
       /* a completer */
     
       return s;
    &#125;
    Il y a pas mal de pièges, mais je pense que tu as de quoi démarrer.
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut
    bonjour!

    je te remercie beaucoup pour tes informations Emmanuel Delahaye.

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

Discussions similaires

  1. [Conception] Probleme pour mettre ajour ma base de donne
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 21/09/2006, 19h49
  2. [PHP-JS] probleme pour mettre du php dans du javascript
    Par carmen256 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 08/07/2006, 17h09
  3. Probleme pour mettre en ligne un formulaire
    Par sdblepas dans le forum Access
    Réponses: 2
    Dernier message: 04/06/2006, 18h08
  4. Probleme pour Mettre à Zero un StringGrid
    Par La_Bande_A_Zozo dans le forum C++Builder
    Réponses: 3
    Dernier message: 23/05/2006, 11h15
  5. Réponses: 2
    Dernier message: 08/08/2003, 18h30

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