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 :

Supprimer les premiers caractères d'une chaine


Sujet :

C

  1. #1
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut Supprimer les premiers caractères d'une chaine
    Bonjour,
    Je début en C,
    J'ai un char[] et je voudrais en supprimer les 6 premiers caractères.
    J'ai tenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hostname = strpbrk(hostname, "host: ");
    mais si ça compile, ça ne fonctionne pas.
    J'ai vu les messages ICI et LA mais je me demande s'il n'y a pas une fonction déjà toute faite qui fait ça directement?
    Merci!

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hostname = strcpy(hostname, hostname + 6);

  3. #3
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    EDIT: GRILLED

    Bonjour,

    Pourquoi ne pas utiliser un strncpy?

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Ça changera rien. Lui ce qu'il veut c'est virer les 6 premiers caractères. Donc on fait un strcpy de la chaine en commençant au 6 ème caractère.

  5. #5
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Ça changera rien. Lui ce qu'il veut c'est virer les 6 premiers caractères. Donc on fait un strcpy de la chaine en commençant au 6 ème caractère.
    Je sais bien j'ai posé ma question à l'OP pour lui donner une piste, et tu m'as grilled dans l'intervalle :p

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Désolé. Je post plus vite que mon ombre.

  7. #7
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Merci pour vos réponses rapides, les gars,

    J'ai tenté de faire un autre truc:
    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
    char *hostname = "host: first.ovh.net";
    	char *host;
    	int i = 0;
            //(jusque là c'est bon, mais la condition du while plante)
    	// Je parcours le mot
            //tant que la valeur mise sur l'adresse est différente de '\0'
            while(strcmp(*(&hostname+6+i),'\0') != 0)
    	{
                    // l'adresse de host est la même que celle de hostname
    		*host[i] = *(&hostname+6+i);
    		i = i+1;
    	}
            // enfin on termine le mot
    	host[i+1] = '\0';
    	printf(host);
    Et j'a l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: invalid type argument of \u2018unary *\u2019 (have \u2018int\u2019)
    :-S

  8. #8
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Pourquoi déréférencer host[i]?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(strcmp(hostname[6]+i),'\0') != 0)
    	{
                    // l'adresse de host est la même que celle de hostname
    		host[i] = hostname[6]+i;
    		i = i+1;
    	}

    C'est pas plus simple?

  9. #9
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Je me trompe peut-être mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(*(&hostname+6+i),'\0') != 0
    ne serait pas la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hostname[6 + i] != '\0'
    ce qui fait aussi que cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *host[i] = *(&hostname+6+i);
    pourrait s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    host[i] = hostname[6 + i];

  10. #10
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Exact, seeme;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    host[i] = *(&hostname+6+i);
    est plus logique. Mais ça ne change rien :-S

    Tu as dit qu'on peut faire un strcpy en commençant par le 6ème caractère, mais dans la doc, il n'y a pas d'argument pour ça :-S on ne peut que copier une chaine dans une autre strictement identique

    Merci pour tes réponses!

  11. #11
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Tu as dit qu'on peut faire un strcpy en commençant par le 6ème caractère, mais dans la doc, il n'y a pas d'argument pour ça :-S on ne peut que copier une chaine dans une autre strictement identique
    Euh tout ce qu'il faut pour faire un strcpy c'est que ta chaine de destination soit suffisamment grande pour accueillir la chaine source. Or comme ta chaine de destination est ta chaine source moins 6 charactères, c'est bon.

  12. #12
    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
    - @6-MarViN et seeme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hostname = strcpy(hostname, hostname + 6);
    Cette solution est fausse : le comportement de strcpy() et strncpy() est indéfini si les objets de départ et d'arrivée se superposent.

    - @Balbuzard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    host[i] = *(&hostname+6+i);
    Pourquoi &hostname ? simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    host[i] = *(hostname+6+i);
    // ou
    host[i] = hostname[6+i];
    et ce à condition qu'un tableau host[] ait été créé. Ce qui n'est pas le cas dans le post #7 précédent.

    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(strcmp(*(&hostname+6+i),'\0') != 0)
    Est une erreur : strcmp sert à comparer des chaines de caractères ce que n'est pas '\0'.
    Ce n'est donc pas équivalent à hostname[6 + i] != '\0' qui lui est légal.

    - Le plus simple, si le tableau host[] existe, est de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(host, hostname+6);

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hostname = strcpy(hostname, hostname + 6);
    Il ne faut jamais utiliser cette fonction lorsque les deux chaînes se chevauchent.

    edit:
    GRILLED

  14. #14
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    hmm je viens d'apprendre quelque chose là.

  15. #15
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Ouah! Je vais apprendre pas mal de trucs sur les pointeurs en lisant vos commentaires!

    J'ai trouvé une solution très simple finalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *hostname;
    	hostname = "host: first.ovh.net";
    	char *host;
    	host = strstr(hostname, "host: ") + 6;
    	printf(host);
    Qui semble marcher correctement.
    Et je me rends compte que je ne vous ai pas donné la totalité du problème car vous ne pouviez pas inventer que le pattern 'host: ' que je recherchais est fixe :-S

    En tout cas merci beaucoup pour votre coup de main!

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

    Au final, la question posée ne correspondait donc pas du tout à ton problème !

  17. #17
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    :-S Sorry!

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

Discussions similaires

  1. supprimer les premiers caractères d'une ligne
    Par cpalperou dans le forum Shell et commandes POSIX
    Réponses: 6
    Dernier message: 12/02/2013, 10h51
  2. prendre les premiers caractères d'une chaine
    Par tytous dans le forum PL/SQL
    Réponses: 5
    Dernier message: 23/12/2010, 10h58
  3. Supprimer les premiers caractères d'une chaîne
    Par supers dans le forum Word
    Réponses: 4
    Dernier message: 21/08/2009, 10h04
  4. Réponses: 2
    Dernier message: 19/06/2007, 16h37
  5. Supprimer le premier caractère d'une chaine de caractères
    Par Droïde Système7 dans le forum Langage
    Réponses: 2
    Dernier message: 30/09/2005, 11h13

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