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écuperer juste ce qu'il y a après un @ dans une variable


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2017
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Récuperer juste ce qu'il y a après un @ dans une variable
    Bonjour,
    après avoir survolé plusieurs forums et essayé plusieurs exemples de code postés sur certain forums, je viens vers vous afin de savoir comment je pourrais effectuer l'équivalent de split MASUPERVAR @

    Exemple :

    av[0] est égale à StatServ
    av[1] est égale à Victorien=+guest@1329595931.fr

    [11:42] <StatServ> Victorien=+guest@1329595931.fr

    je voudrais que ma fonction retourne le 1329595931.fr seulement s'il-vous-plait.
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Bonjour,

    Ce n'est pas forcément très difficile mais il faut bien retenir qu'en C, il n'y a pas vraiment de type « chaîne de caractère » natif. Soit c'est un tableau de caractère qui contient directement ta chaîne mais tu ne pourras pas faire une fonction qui retourne un tableau, soit ta variable est en fait un pointeur vers le bon endroit en mémoire.

    Le plus simple ici est de recourir à strchr() (String Character). Si tu écris :

    Alors cette fonction te renverra un pointeur vers l'adresse du « @ » dans ta chaîne, depuis lequel tu pourras lire le reste, jusqu'au caractère nul final. Si tu veux ignorer ce « @ », il te suffit d'avancer d'exactement 1 caractère, avec l'arithmétique des pointeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        char * domain;
     
        domain = strchr (av[1],'@');
     
        if (domain != NULL) 
        printf ("Nom du domaine de l'adresse e-mail : %s\n", domain+1);
        else
        printf ("Séparateur @ non trouvé dans la chaîne.\n");

  3. #3
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    C'est une mission pour strchr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char *substr(const char *s, char delim) {
        const char *const pos = strchr(s, delim);
        return pos ? pos + 1 : NULL;
    }

    Tu peux également réaliser un split destructif via strtok si tu as besoin de quelque chose de plus complexe.


    EDIT: grillé par Obsidian.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2017
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,

    Ce n'est pas forcément très difficile mais il faut bien retenir qu'en C, il n'y a pas vraiment de type « chaîne de caractère » natif. Soit c'est un tableau de caractère qui contient directement ta chaîne mais tu ne pourras pas faire une fonction qui retourne un tableau, soit ta variable est en fait un pointeur vers le bon endroit en mémoire.

    Le plus simple ici est de recourir à strchr() (String Character). Si tu écris :

    Alors cette fonction te renverra un pointeur vers l'adresse du « @ » dans ta chaîne, depuis lequel tu pourras lire le reste, jusqu'au caractère nul final. Si tu veux ignorer ce « @ », il te suffit d'avancer d'exactement 1 caractère, avec l'arithmétique des pointeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        char * domain;
     
        domain = strchr (av[1],'@');
     
        if (domain != NULL) 
        printf ("Nom du domaine de l'adresse e-mail : %s\n", domain+1);
        else
        printf ("Séparateur @ non trouvé dans la chaîne.\n");
    Bonjour, merci cela fonctionne, dernière question, comment puis je faire suivre une variable ? dans deux fonctions différente,

    je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int denora_event_302(char *source, int ac, char **av)
    {
        if (denora->protocoldebug) {
            protocol_debug(source, ac, av);
        }
    char * domain;
     
        domain = strchr (av[1],'@');
     
        if (domain != NULL) 
    send_cmd(s_StatServ, "PRIVMSG #CS :vhost = %s", domain+1);
        else
    send_cmd(s_StatServ, "PRIVMSG #CS :@ non trouvé");
    }
    je voudrais récupéré la variable domain+1 ici (localisé dans le même fichier source) a la place du "Indisponible":

    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
    int denora_event_nick(char *source, int ac, char **av)
    {
        char *ipchar = NULL;
        Server *s;
     
        if (denora->protocoldebug) {
            protocol_debug(source, ac, av);
        }
        if (ac != 2) {
            s = findserver_uid(servlist, av[5]);
    	 ipchar = host_resolve(av[4]);
    	 send_cmd(s_StatServ, "USERHOST :%s", av[0]);
    	        do_nick("", av[0], av[3], "Indisponible", s ? s->name : source, av[6],
                    UplinkSynced ? time(NULL) : 0, 0, ipchar, NULL, NULL,
                    strtoul(av[4], NULL, 10), "+i", NULL);
           send_cmd(s_StatServ, "PRIVMSG %s :VERSION", av[0]);
    	 free(ipchar);
        } else {
            do_nick(source, av[0], NULL, NULL, NULL, NULL,
                    0, 0, NULL, NULL, NULL, 0, NULL, NULL);
        }
        return MOD_CONT;
    }
    Merci d'avance de votre aide à tous

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 4nth0nym3 Voir le message
    Bonjour, merci cela fonctionne, dernière question, comment puis je faire suivre une variable ? dans deux fonctions différente,
    Bonjour
    La solution de facilité est d'utiliser une variable globale. Ca peut suffire pour les trucs simples mais pour un projet de grande envergure c'est la pire des idées (déjà quand il y a beaucoup de fonctions on ne sait plus ensuite qui y touche ; et si en plus tu crées par accident une variable locale du même nom que la globale, cette dernière est alors masquée et indisponible).

    Sinon il faut que chacune des deux fonctions puisse modifier une variable qui lui est extèrieure. Cela ne peut se faire que si tu passes l'adresse de cette variable à tes deux fonctions (et les fonctions récupèreront cette adresse dans un pointeur)

    Citation Envoyé par 4nth0nym3 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int denora_event_302(char *source, int ac, char **av)
    {
        if (denora->protocoldebug) {
            protocol_debug(source, ac, av);
        }
    char * domain;
     
        domain = strchr (av[1],'@');
    }
    je voudrais récupéré la variable domain+1 ici (localisé dans le même fichier source) a la place du "Indisponible":
    Donc là ça peut se faire ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int denora_event_302(char *source, int ac, char **av, char **domain)
    {
        if (denora->protocoldebug) {
            protocol_debug(source, ac, av);
        }
     
        *domain = strchr (av[1],'@');
        ... (suite du code)...
    }

    Et chez l'appelant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *toto;
    denora_event_302(..., ..., ..., &toto);
    Quand la fonction se termine, la variable "toto" contient exactement la même chose que ce qui a été copié dans la variable interne "domain" dans la fonction...

    Ou alors dans ce cas très particulier, ta fonction (puisqu'elle ne renvoie rien) peut renvoyer le pointeur "domain". Dans ce cas tu ne "suis pas" une variable dans ta fonction mais tu t'arranges pour que ta fonction renvoie l'info qui t'intéresse que tu récupères depuis l'appelant. Cela ne correspond donc plus à ta demande (suivre une variable) mais si l'info voulue est bien récupérée, pourquoi pas...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char* denora_event_302(char *source, int ac, char **av)
    {
        if (denora->protocoldebug) {
            protocol_debug(source, ac, av);
        }
        char *domain;
     
        domain = strchr (av[1],'@');
        ... (suite du code)...
        return domain;
    }

    Et chez l'appelant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *toto;
    toto=denora_event_302(..., ..., ...);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2017
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Merci de ta réponse en rapport a mon logiciel ce n'est pas possible de faire comme j'avais penser faire.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2017
    Messages : 11
    Points : 10
    Points
    10
    Par défaut récupérer ce qu'il y a dans une var avant un =
    Re bonjour, a l'inverse d'hier je voudrais savoir comment récupérer ce qui se trouve avant =

    syntax recu : Droopsy=+guest@3817826718.net
    je voudrais prendre Droopsy(varie suivant le nick de l'utilisateur) jusque = sans le comprendre dans le resultat

    Merci d'avance

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par 4nth0nym3 Voir le message
    Re bonjour, a l'inverse d'hier je voudrais savoir comment récupérer ce qui se trouve avant l'arobase

    Merci d'avance
    Une chaîne, en C, est un tableau de caractères dont le dernier vaut 00 et sert de sentinelle. Le C propose toutes les fonctions nécessaires à la manipulation des chaînes de caractères mais, à chaque fois ou presque, c'est à toi d'allouer la mémoire nécessaire : celle-ci n'est pas directement prise en charge par le type lui-même. Certaines fonctions sont à même de faire cette allocation automatiquement mais il faut penser ensuite à libérer cette mémoire à la main.

    Une fois ceci posé, tu as plusieurs approches à ta disposition :

    1. Soit tu remplaces directement l'arobase par un 00, ce qui te permettra à peu de frais de faire croire qu'il s'agit de deux sous-chaînes distinctes :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
          char * arobase;
       
          arobase = strchr(av[1],'@');
          *arobase = '\0';
          printf ("Partie gauche : %s ; partie droite : %s.\n",av[1],arobase+1);
    2. Soit tu déduis directement, via l'arithmétique des pointeurs, la distance depuis le début de ta chaîne jusqu'à l'arobase et, donc, la longueur de la partie gauche, et tu passes directement cette longueur à printf() ou aux fonctions de copie de chaîne (c'est utile quand tu ne peux pas écrire dans la chaîne). Voir la documentation de printf pour toutes les subtilités de sa syntaxe :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
          char * arobase;
       
          arobase = strchr(av[1],'@');
          printf ("Partie gauche : %.*s ; partie droite : %s.\n",arobase-av[1],av[1],arobase+1);
    3. Soit encore, tu suis les conseils de Matt Houston et tu utilises strtok (String Tokenize) qui permet de découper une chaîne en sous-morceaux, par rapport à une liste de caractères considérés comme des délimiteurs. C'est la version automatique du point numéro 1, mais ce n'est pas forcément plus facile à utiliser si tu n'as qu'un seul délimiteur dans ta chaîne.


    Et dans tous les cas, il vaut mieux pratiquer un peu ces facettes du langage C de façon à ce que tout cela devienne naturel quel que soit le contexte.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 4nth0nym3 Voir le message
    Re bonjour, a l'inverse d'hier je voudrais savoir comment récupérer ce qui se trouve avant l'arobase

    syntax recu : Droopsy=+guest@3817826718.net
    je voudrais prendre Droopsy(varie suivant le nick de l'utilisateur) jusque = sans le comprendre dans le resultat
    Attention, d'un coté tu indiques que ton délimiteur est l'arobase, et de l'autre le "=". Essaye de rester cohérent dans tes indications. Surtout que à la limite nous on peut s'adapter et rectifier, mais un ordi, lui, fera exactement ce que tu lui indiques et rien d'autre => si tu indiques "=" il cherchera "=" ; et si tu indiques "arobase" il cherchera "arobase".

    Ceci dit ça reste un détail et Obsidian t'a donné des pistes. strchr ou strchr_r permettent de chercher un caractère (de ton choix) dans une chaine en partant du début ou de la fin. Une fois que tu as ce caractère (en réalité sa position) un peu d'algo de base te permet de récupérer cequ'il y a avant et/ou après.
    Et strtok ou strtok_r se comportent comme un pseudo-split sur le caractère considéré (il faut l'intégrer dans une boucle pour pouvoir traiter chaque sous-chaine trouvée). J'ai toutefois une nette préférence pour strtok_r car elle est réentrante donc elle permet de sous-splitter ce que ne permet pas strtok à cause de son contexte statique..
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2017
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Merci cela fonctionne j'ai pu faire ce que je voulais Bonne soirée a tous

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

Discussions similaires

  1. recuperer la valeur d'un input crée en js dans une variable php
    Par pitichamo dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 03/10/2009, 20h44
  2. Recuperer variable Javascript dans une variable Java
    Par drizztoli dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/09/2005, 14h58
  3. Recuperer un enregistrement de requete SQL dans une variable
    Par kleenex dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/09/2005, 15h59
  4. Récupérer contenu de fichier dans une variable
    Par peppena dans le forum Linux
    Réponses: 4
    Dernier message: 15/06/2005, 12h50
  5. Recuperer un champ calculé dans une variable....
    Par vijeo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/12/2004, 14h57

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