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 actif Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 263
    Points
    263
    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!
    ZORRO
    Plus Vengeur que Masqué

  2. #2
    Membre confirmé
    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
    Points : 538
    Points
    538
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hostname = strcpy(hostname, hostname + 6);
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

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

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

    Bonjour,

    Pourquoi ne pas utiliser un strncpy?

  4. #4
    Membre confirmé
    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
    Points : 538
    Points
    538
    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.
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    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 confirmé
    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
    Points : 538
    Points
    538
    Par défaut
    Désolé. Je post plus vite que mon ombre.
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

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

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 263
    Points
    263
    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
    ZORRO
    Plus Vengeur que Masqué

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    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 confirmé
    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
    Points : 538
    Points
    538
    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];
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

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

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 263
    Points
    263
    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!
    ZORRO
    Plus Vengeur que Masqué

  11. #11
    Membre confirmé
    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
    Points : 538
    Points
    538
    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.
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

  12. #12
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  13. #13
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    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 confirmé
    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
    Points : 538
    Points
    538
    Par défaut
    hmm je viens d'apprendre quelque chose là.
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

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

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 263
    Points
    263
    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!
    ZORRO
    Plus Vengeur que Masqué

  16. #16
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut

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

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 263
    Points
    263
    Par défaut
    :-S Sorry!
    ZORRO
    Plus Vengeur que Masqué

+ 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