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 :

Découper une chaîne de caractères ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut Découper une chaîne de caractères ?
    Salut,

    Bon voila j'aimerais découper une chaine de caractère a partir d'une position donnée et jusqu'à une position donnée.

    Un petit exemple pour mieux comprendre

    Ma chaine a découper :
    "c:/nimportequi/test/SE/123456789_rei_1.txt"

    Et il faudrait que je la coupe du dernier '/' au premier '_'. Donc j'aurais comme nouvelle chaine "123456789".

    Pour le moment je récupère la position du dernier '/' et '_' mais je ne vois pas comment faire pour commencer a recopier la chaine a partir du '/' et finir au '_'.
    Jspr que vous me suivez :/ et sinon voila le code que j'ai commencé pour recup' les positions .
    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
    25
    26
    27
    28
    29
    30
    31
    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char chaine1[1000] = "c:/nimportequi/test/SE/123456789_rei_1.txt";
     int positionSlash, longueurChaine1, positionTiret;
     int i=0, j=0;
     
     /*Recuperation Longeure de la chaine1 */
     longueurChaine1 = strlen(chaine1);
     
     /*Recuperation position du dernier '/'*/
     for(i=0;i<longueurChaine1;i++)
     {
          if(chaine1[i] == '/')
          {
                       positionSlash=  i;
          }
     }
     /*Recuperation position du premier '_'*/
     while(chaine1[j] != '_')
          {
                       positionTiret=  j+1;
                       j++;
          }
     printf("%d ",positionSlash);
     printf("%d ",positionTiret);
     
     system("pause");
     return 0;
    }

    Merci d'avance

  2. #2
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Utilisez memcpy(); avec une taille agale a la différence des deux pointeurs ..............

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    Utilisez memcpy(); avec une taille égale a la différence des deux pointeurs ..............
    Ou la Ca dépend du types des éléments

    Une différence de pointeurs (sur le même objet) donne un nombre d'éléments et non une taille en bytes. Pour un type char, c'est pareil, mais pour un wchar_t, c'est faux...

    Et le 0 final ?

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    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
    25
    26
    27
    28
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main (void)
    {
       char const *chaine = "c:/nimportequi/test/SE/123456789_rei_1.txt";
       char const *debut_chaine = strrchr (chaine, '/');
     
       if (debut_chaine != NULL)
       {
          char const *fin_chaine = strchr (++debut_chaine, '_');
     
          if (fin_chaine != NULL)
          {
             size_t len = (size_t)(fin_chaine - debut_chaine);
             char *motif = malloc ((len + 1) * sizeof *motif);
             if (motif != NULL)
             {
                motif[0] = '\0'; /* consistent C string */
                strncat (motif, debut_chaine, len);
                puts (motif);
             }
          }
       }
       getchar ();
       return 0;
    }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    Wow merci pour vos réponse rapide !

    cependant dans ton code nicolas.sitbon je ne comprend pas très bien les 2 lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    size_t len = (size_t)(fin_chaine - debut_chaine); /*Je vois que c'est pour connaitre la taille entre le début et la fin mais pourquoi tu multiplie size_T par fin_chaine - debut_chaine ? Et dsl si ca vous parait logique mais je debute*/
    motif[0] = '\0'; /* Pourquoi tu ajoute '\0' au debut de la chaine ? */
    getchar (); /* C'est juste pour arreter le programme ? On peu le remplacer par system("pause") ?*/

    Merci est dsl pour les question peu être bête.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par jojo72000 Voir le message
    Wow merci pour vos réponse rapide !

    cependant dans ton code nicolas.sitbon je ne comprend pas très bien les 2 lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    size_t len = (size_t)(fin_chaine - debut_chaine); /*Je vois que c'est pour connaitre
     la taille entre le début et la fin mais pourquoi tu multiplie size_T par fin_chaine - debut_chaine ? 
    Et dsl si ca vous parait logique mais je debute*/
     
    motif[0] = '\0'; /* Pourquoi tu ajoute '\0' au debut de la chaine ? */
     
    getchar (); /* C'est juste pour arreter le programme ? On peu le remplacer par system("pause") ?*/

    Merci est dsl pour les question peu être bête.
    le soucis est que (fin_chaine - debut_chaine) renvoi une valeur de type ptrdiff_t et
    ma varaible est de type size_t alors je caste (et non ça n'est pas une multiplication mais
    une simple indication pour le compilateur).

    motif[0] = '\0'; => peu après, j'utilise la fonction strncat, qui demande en entrée
    une chaine valide (au sens C) ce qui veut dire qu'elle doit être terminé par un NUL byte.
    Comme ma chaine est vide, je met le premier caractère à 0.

    getchar () est portable alors que system ("pause") ne l'est pas et ne fonctionne pas sur ma bécane.

  7. #7
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ou la Ca dépend du types des éléments

    Une différence de pointeurs (sur le même objet) donne un nombre d'éléments et non une taille en bytes. Pour un type char, c'est pareil, mais pour un wchar_t, c'est faux...

    Et le 0 final ?
    Oui c'est vrai, j'ai oublié de le spécifier .... merci Emmanuel Delahaye

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    Ha ok merci bcp pour ces excellente explications !
    Du coup grâce a votre aide je vient de finir le programme sur lequel je travaille depuis 2 semaine. C'est mon 1er "vrai" programme et ca marche ! Je ne pensais pas que ça allez être aussi jouissif

    En tous cas un enorme merci a vous 3

  9. #9
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Heureux d'avoir pu t'aider, pense à la balise résolu.
    Cordialement.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    Bon j'ai une autre petite question histoire d'améliorer un peu le programme.
    Peut on lancer un dossier automatiquement ? En effet a la fin du programme j'aimerais ouvrir un dossier donné avec l'explorateur windows. Mais je sais comment ouvrir un fichier ou un programme mais pas un dossier

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jojo72000 Voir le message
    Bon j'ai une autre petite question histoire d'améliorer un peu le programme.
    Peut on lancer un dossier automatiquement ? En effet a la fin du programme j'aimerais ouvrir un dossier donné avec l'explorateur windows. Mais je sais comment ouvrir un fichier ou un programme mais pas un dossier
    chdir () ?

    [windows]
    system("explore mondossier"); ?

  12. #12
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Citation Envoyé par jojo72000 Voir le message
    Bon j'ai une autre petite question histoire d'améliorer un peu le programme.
    Peut on lancer un dossier automatiquement ? En effet a la fin du programme j'aimerais ouvrir un dossier donné avec explorateur windows. Mais je sais comment ouvrir un fichier ou un programme mais pas un dossier
    Normalement c'est un appel au binaire "explorer.exe" du Windows, tu peut passer des argument au explorateur Windows pour qu'il ouvre le répertoire que tu veut...

Discussions similaires

  1. Découper une chaîne de caractères
    Par gege2061 dans le forum Langage
    Réponses: 9
    Dernier message: 07/03/2008, 19h59
  2. [Tableaux] Découper une chaîne de caractères
    Par mix_35 dans le forum Langage
    Réponses: 5
    Dernier message: 17/03/2007, 02h06
  3. Découper une chaîne de caractères
    Par The Lord of Nesquik dans le forum C
    Réponses: 5
    Dernier message: 04/02/2007, 00h20
  4. [VBA-E] découper une chaîne de caractère
    Par jagwar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/07/2006, 14h07
  5. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58

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