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 :

récupérer un char*


Sujet :

C

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut récupérer un char*
    bonjour,
    je veux déclarer une chaine et la récupérer voici mon programme

    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
     
    int main()
    {
            char* str1;
            char* str2;
     
           printf("donner la chaine 1 :  ");
            scanf("%s",str1);
            printf("la chaine 1 :  %s\n",str1);
     
            printf("donner la chaine 2 :  ");
            scanf("%s",str2);
            printf("la chaine 2 :  %s\n",str2);
     
               return 0;
    }
    je veux qu'il soit char* car je vais le passer en paramètre dans une fonction
    merci

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Lea,

    Pour commencer, il faut réserver de la mémoire pour les chaînes str1 et str2 : la déclaration d'un pointeur ne réserve pas de place pour les données sur lesquelles il pointera.

  3. #3
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Deux solutions s'ouvrent à toi:

    1 : Utilisation de tableaux statiques
    Rien ne t'empêche dans ton programme, d'utiliser des tableaux statiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char str1 [TAB_SIZE];
    char str2 [TAB_SIZE];
    étant une constante symbolique genre:
    qui définie la taille de tes chaînes. Simple à mettre en oeuvre mais impossible à redimensionner si tu veux des chaînes de plus grande tailles par la suite (ou plus petites) mais rien ne t'empêche de les passer à une fonction comme ceci:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAB_SIZE 80
     
    void afficher_chaine (const char * p)
    {
       printf ("%s\n", p);
    }
     
    int main (void)
    {
       char str1 [TAB_SIZE];
     
       strcpy (str1, "Bienvenue sur developpez.com !");
       afficher_chaine (str1);
     
       return EXIT_SUCCESS;
    }
    2 : Allocation dynamique
    Là il faut allouer toi même l'espace que doit avoir tes chaînes donc leur taille soit si je reprend l'exemple précédent:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAB_SIZE 80
     
    void afficher_chaine (const char * p)
    {
       printf ("%s\n", p);
    }
     
    int main (void)
    {
       char * str1 = malloc (TAB_SIZE);
     
       if (str1)
       {
          strcpy (str1, "Bienvenue sur developpez.com !");
          afficher_chaine (str1);
          free (str1);
       }
     
       return EXIT_SUCCESS;
    }
    Sans bien sûr, ne pas oublier de libérer l'espace ainsi allouer, ce que fait la fonction free ()

    Si je peut te donner un conseil, tu ferais bien de lire un cours pour apprendre le C car ça, c'est les bases que tout débutant apprend à un moment donné dans un livre ou un tutoriel: http://melem.developpez.com/tutoriel...ion-langage-c/

    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 !

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    oui mais le problème ici c'est que str1 et str2 seront passer en paramètres dans une autre fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LCS(char* str1,char* str2);
    quand je déclare avec je peux pas les passer en paramètres

  5. #5
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bin si tu peux, c'est bel et bien ce que j'ai fait dans le premier exemple. Sinon tu prend le second exemple ou tu montre le code complet si ce n'est pas trop long.
    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 !

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut chaine
    Ca sent les segfault à plein nez ....

    En C les chaines de caractères n'existe pas vraiment, en fait les chaines sont des tableaux de char. La fin d'une chaine est repérée par les fonctions de la libc par le char \0.

    Ca devient vite dangereux si tu fait n'importe quoi.

    Une chaine a donc une taille limite non modifiable, si tu dépasses cette taille, tu vas écraser des données

    lis ce tuto :
    http://nicolasj.developpez.com/articles/libc/string/
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Membre actif
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 42
    Par défaut scanf() ???? mauvaise idee .
    La solution ici , serai d utiliser malloc , avec une valeur quelconque , et comme on ne peut predire ce le nombre de caracteres que l utilisateur entrera , utiliser realloc si l utilisateur depasse la valeur maximal fixé par le programmeur . et le tout avec un getchar() .

    ps : EVITEZ d utiliser scanf() pour les entrées dont on ne connait pas la taille par avance, sinon BufferOverflow

  8. #8
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Si, on peut éventuellement allouer la zone dynamiquement avec la bonne taille avec une allocation par progression géométrique. Cela dit, ça peut faire pas mal d'appels à realloc
    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 !

  9. #9
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    La fonction fgets est bien pour faire ce genre de choses.

  10. #10
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par imperio Voir le message
    La fonction fgets est bien pour faire ce genre de choses.
    Oui tout à fait,tu peux aussi lire ce tutoriel http://emmanuel-delahaye.developpez....ees-solides-c/
    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 !

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Par défaut
    Bonsoir,
    Si c'est le compilateur GNU, on peut utiliser scanf avec une allocation dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void maFonction (void) {
        char *chaine;
     
        scanf("%ms", &chaine);
        .....
        free(chaine);
    }
    Le modificateur 'm' demande l'allocation dynamique. L'avantage est que l'on a pas besoin de connaitre la longueur de la chaine.
    Mais bon, il est vrai que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define MAX_LEN _SZSTRING 21
     
    void maFonction (void) {
      char *chaine;  
     
      chaine = malloc(MAX_LEN_SZSTRING);
      fgets(chaine, MAX_LEN_SZSTRING, stdin);
         .....
      free(chaine);
    }
    est un peu plus standard.

    Cordialement,

    Jean-Pierre.

Discussions similaires

  1. récupérer un char au clavier
    Par artemis93 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 07/05/2013, 10h41
  2. Réponses: 20
    Dernier message: 02/04/2010, 11h02
  3. Récupérer un char 3 étoiles et un double 2 étoiles d'une DLL en VBA ?
    Par beafrancky dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/06/2009, 17h10
  4. Réponses: 4
    Dernier message: 26/05/2006, 19h02
  5. récupérer une partie d'un char*
    Par r0d dans le forum C
    Réponses: 5
    Dernier message: 10/11/2005, 14h14

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