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 :

séparer contenu d'une chaine de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Par défaut séparer contenu d'une chaine de caractères
    bonjour,

    Dans mon programme, j'ai une variable char (appelée total par exemple) qui contient ceci: "stop 192.168.51.87"
    et souhaite séparer le contenu de cette variable "total" pour au final en avoir 2, une (appelée buffer1) qui va contenir "stop" et l'autre (appelée buffer2) "192.168.51.87"
    J'ai réussit pour la premiere en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy(buffer1, total, 4)
    Mais pour l'autre je ne trouve pas

    Quelqu'un aurait-il une idée?

    Merci pour votre aide

    ++

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Salut,

    Le problème avec cette utilisation de strncpy, c'est que si buffer1 est un tableau de 4 caractères, strncpy copiera 4 caractères dedans sans ajouter le caractère nul terminal. Fait attention d'allouer un tableau de 5 caractères pour buffer1 et d'ajouter toi-même le caractère nul, par exemple en initialisant toutes les cases de buffer1 à 0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buffer1[5] = {0};
    strncpy(buffer1, total, sizeof(buffer1)-1);
    ou une solution que je préfère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    buffer1[0] = '\0';
    strncat(buffer1, total, sizeof(buffer1)-1);
    Ensuite, pour la deuxième partie, tu cherches la 1ère position dans ta chaîne total où apparaît un décimal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <ctype.h>
    /*...*/
    int i;
    char buffer2[15]
    /*...*/
    i = 0;
    while (!isdigit(total[i]){
        ++i;
    }
     
    buffer2[0] = '\0';
    strncat(buffer2, total+i, sizeof(buffer2)-1);
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Je prefere le strncpy

    Voici ma solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    const char * space_pos;
    unsigned tmplg;
     
    space_pos = strchr(total, ' ');
     
    assert(space_pos != NULL); /* on considere qu'il doit yavoir cet espace */
     
    tmplg = space_pos - total; /* arithmetique de pointeurs */
    strncpy(buffer1, total, tmplg);
    buffer1[tmplg] = '\0';
     
    /* recopie ce qu'il ya apres l'espace jusqu'à la fin de la chaine */
    strcpy (buffer2 /* on considere que buffer2 est suffisament grand */, space_pos + 1);

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Gruik
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tmplg = space_pos - total; /* arithmetique de pointeurs */
    Je me suis fait déjà taper sur les doigts à plusieurs reprises parce que je n'utilisais pas le type ptrdiff_t définit dans l'en-tête stddef.h pour recevoir le résultat d'une soustraction de pointeurs.

    Sinon, je trouve ton code assez confus.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par mujigka
    Je me suis fait déjà taper sur les doigts à plusieurs reprises parce que je n'utilisais pas le type ptrdiff_t définit dans l'en-tête stddef.h pour recevoir le résultat d'une soustraction de pointeurs.
    Tiens, connaissais pas ce type...
    Bah.. j'imagine qu'il ya un probleme si les caracteres n'étaient pas sur 1 octet, mais on peut considérer que c'est le cas non?
    Ca serait pas plus choquant que malloc(longueur_de_chaine + 1)

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Gruik
    Tiens, connaissais pas ce type...
    Bah.. j'imagine qu'il ya un probleme si les caracteres n'étaient pas sur 1 octet, mais on peut considérer que c'est le cas non?
    Ca serait pas plus choquant que malloc(longueur_de_chaine + 1)
    J'ai retenu cela du cours de Christian Casteyde concernant l'apprentissage du C et C++ (avec une orientation C++ quand même...)
    Citation Envoyé par Méga Cours Christian Casteyde
    Le type du résultat de la soustraction de deux pointeurs est très dépendant de la machine cible et du modèle mémoire du programme. En général, on ne pourra jamais supposer que la soustraction de deux pointeurs est un entier (que les chevronnés du C me pardonnent, mais c'est une erreur très grave). En effet, ce type peut être insuffisant pour stocker des adresses (une machine peut avoir des adresses sur 64 bits et des données sur 32 bits). Pour résoudre ce problème, le fichier d'en-tête stdlib.h contient la définition du type à utiliser pour la différence de deux pointeurs. Ce type est nommé ptrdiff_t.
    voir http://cpp.developpez.com/cours/cpp/

    En revanche, c'est stddef.h et non stdlib.h qui contient cette définition.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par gy0m76
    Dans mon programme, j'ai une variable char (appelée total par exemple) qui contient ceci: "stop 192.168.51.87"
    et souhaite séparer le contenu de cette variable "total" pour au final en avoir 2, une (appelée buffer1) qui va contenir "stop" et l'autre (appelée buffer2) "192.168.51.87"
    Salut,

    La solution de mujigka est sans doute la plus propre.

    Cependant, si tu es certain que ta chaîne commencera toujours par les 5 caractères "stop ", tu peux peut-être faire plus rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char* buffer1 = total;
    char* buffer2 = total + 5;
    total[4] = '\0';
    ou alors, si tu as besoin d'une copie des deux chaînes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char* buffer1 = strndup(total, 4);
    char* buffer2 = strdup(total+5);
    ...
    free(buffer1); buffer1 = NULL;
    free(buffer2); buffer2 = NULL;

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Si je ne me trompe pas, strndup est une extension gcc, ou en tout cas n'est pas standard, ce qui peut poser des problèmes de portabilité. Mais c'est très facile de coder une fonction équivalente.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par mujigka
    Si je ne me trompe pas, strndup est une extension gcc, ou en tout cas n'est pas standard, ce qui peut poser des problèmes de portabilité. Mais c'est très facile de coder une fonction équivalente.

    Thierry
    Je confime :
    Citation Envoyé par [url=http://man.developpez.com/man3/strdup.3.php#L6]man strdup[/url]
    CONFORMITÉ
    SVID 3, BSD 4.3. strndup(), strdupa(), et strndupa() sont des extensions GNU.
    Copier une chaîne de caractères


  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par gege2061
    On peut aussi utiliser ce que nous offre la glib:
    http://developer.gnome.org/doc/API/2...html#g-strndup

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/06/2015, 15h03
  2. [WD16] Executer formule contenu dans une chaine de caractère
    Par J0r_x dans le forum WinDev
    Réponses: 1
    Dernier message: 02/11/2011, 14h39
  3. Réponses: 8
    Dernier message: 16/05/2008, 10h34
  4. Réponses: 2
    Dernier message: 02/10/2007, 11h42
  5. [VB6] Parser XML contenu dans une chaine de caractère
    Par pegase06 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/09/2007, 11h35

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