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 :

Utilisation de sscanf


Sujet :

C

  1. #1
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut Utilisation de sscanf
    Salut,

    j'aimerais avoir une aide concernant ceci:
    A partir d'une chaine de caractère,par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *ligne = "    x   ,    y    ,z     "
    il faut que j'insère les caractères lus dans un tableau char *tab en utilisant sscanf.
    Il faut également le nombre de lettre insérées.

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Cherche dans les sources ou la FAQ, il y a un tuto sur scanf, (et donc sscanf).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Voir plutôt du coté de la fonction strtok

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Voir plutôt du coté de la fonction strtok
    Cette fonction est déclaŕée dans les pages manuels comme une fonction à ne pas utiliser... Personnes averties seulement!!

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Luther13
    Voir plutôt du coté de la fonction strtok
    Utilisé sscanf m'est imposé

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Oui, à cause du manque de réentrance mais la je ne pense pas que ce soit le cas ici.
    Le problème est que strtok utilise un buffer interne static et donc il peut y avoir mélange en cas d'utilisation simultanée par deux threads distincts d'un même programme.
    D'autre part, strtok modifie la chaîne passée en argument, celà peut poser des problèmes.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    man sscanf (sous linux ou alors sur google)
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Trap D
    Oui, à cause du manque de réentrance mais la je ne pense pas que ce soit le cas ici.
    Le problème est que strtok utilise un buffer interne static et donc il peut y avoir mélange en cas d'utilisation simultanée par deux threads distincts d'un même programme.
    D'autre part, strtok modifie la chaîne passée en argument, celà peut poser des problèmes.
    Plus simplemement, on se sais pas faire d'appels imbriqués de strtok()

    Par exemple

    a=1 b=2 c=3

    Première découpe en
    a=1
    b=2
    c=3

    ensuite (ok ici, c'est trivial)

    découpe imbriquée en:
    a
    =
    1

    b
    =
    2

    c
    =
    3

    strtok() ne sait pas faire ça 'à la volée', ou alors il faut copier la chaine (strdup())...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    voici le programme que j'ai écrit concernant la question que j'avais posé mais à la compilation,le programme m'affiche une ligne vide ?


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include<stdio.h>
    #include<ctype.h>
    #include<stdlib.h>
     
    int chaine(char *ligne,char *tab)
    {
      char lettre;
      int nb_lettres = 0;  
     
      while(*ligne == ' ') ligne ++;
     
      while(*ligne != '\0')
        {
          if(!(isalpha(*ligne))) return 1;
     
          sscanf(ligne,"%c",&lettre);
          ligne++;
          nb_lettres ++;
          while(*ligne == ' ' || *ligne == ',') ligne ++;
        }     
      tab = (char*)malloc(sizeof(char)*nb_lettres);
      if(tab == NULL) return 1;
     
      return 0;
    }
     
     
     
    int main(void)
    {
      char *entree = " x       ,          z    ";
      char*tab;  
     
      if(chaine(entree,tab))
        {
          printf("erreur \n");
          return 1;
        }
     
      printf("%s\n",tab);
     
      return 0;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Gryzzly
    voici le programme que j'ai écrit concernant la question que j'avais posé mais à la compilation,le programme m'affiche une ligne vide ?
    Tu veux dire à l'exécution.
    Déjà, chez moi, ça crash parce que tu passes une valeur indéterminée à 'chaine' (tab est un pointeur non initialisé). Il se passe donc n'importe quoi...

    Ensuite, je n'ai pas réussi à déterminer ce que doit faire la fonction chaine(). Peut être qu'un meilleur nom serait plus parlant... (action, verbe...). En tout cas, elle cherche à modifier un paramètre, ce qui est probablement une erreur de conception...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Gryzzly
    voici le programme que j'ai écrit concernant la question que j'avais posé mais à la compilation,le programme m'affiche une ligne vide ?
    Tu veux dire à l'exécution.
    Déjà, chez moi, ça crash parceque tu passes une valeur indéterminée à 'chaine' (tab est un pointeur non initialisé). Il se passe donc n'importe quoi...

    Ensuite, je n'ai pas réussi à déterminer ce que doit faire la fonction chaine(). Peut être qu'un meilleur nom serait plus parlant... (action, verbe...)
    la fonction chaine à pour but de récupérer les lettres lues et de les mettres dans tab

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    L'idée est bonne mais tu ne remplis pas finalement le tableau lorsque tu recupère la lettre.
    Je proposerais de compter d'abord le nombre de virgules dans chaine afin de connaitre d'avance la taille du tableau à allouer. puis après d'après d'effectuer le traiteemnt de remplissage

  13. #13
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Luther13
    L'idée est bonne mais tu ne remplis pas finalement le tableau lorsque tu recupère la lettre.
    Je proposerais de compter d'abord le nombre de virgules dans chaine afin de connaitre d'avance la taille du tableau à allouer. puis après d'après d'effectuer le traiteemnt de remplissage
    Lorsque j'execute le programme,l'affichage n'arrive pas.
    Il doit y avoir un problème mais lequel?

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include<stdio.h>
    #include<ctype.h>
    #include<stdlib.h>
     
     
    int compteVirgules(char *ligne)
    {
      int compteur = 0;
     
      while(*ligne != '\0')
        {
     
          if(*ligne == ',') compteur ++;
     
          else ligne ++;
        }
      return (compteur + 1); 
    }
     
     
    int chaine(char *ligne,char *tab)
    {
      char lettre; 
      int nb_virgules = compteVirgules(ligne);
      int i=0;  
     
      while(*ligne == ' ') ligne ++;
     
      tab = (char*)malloc(sizeof(char)*nb_virgules);
      if(tab == NULL) return 1;
     
     
      while(*ligne != '\0')
        {
          if(!(isalpha(*ligne))) return 1;
     
          sscanf(ligne,"%c",&lettre);
          ligne ++;
          tab[i++] = lettre;
     
          while(*ligne == ' ' || *ligne == ',') ligne ++;
        }     
      return 0;
    }
     
     
     
    int main(void)
    {
      char entree[] = " x       ,          z    ";
      char*tab;  
     
      if(chaine(entree,tab))
        {
          printf("erreur \n");
          return 1;
        }
     
      printf("%s\n",tab);
     
      return 0;
    }

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Une étude des pointeurs serait nécessaire...

    Ceci ne marchera jamais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      char*tab; 
     
      if(chaine(entree,tab))
    Avec comme prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int chaine(char *ligne,char *tab)

    Et dans la fonction...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      tab = (char*)malloc(sizeof(char)*nb_virgules);

    Si je te donne le programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    void f(int a)
    {
    a=2;
    }
     
    int main()
    {
    int a;
    f(a);
    printf("%d\n",a);
    return 0;
    }
    Qu'affiche ce programme?

    Ton programme fait la même chose, il passe la valeur du pointeur tab et espère par un miracle que la fonction pourra la changer...

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Déjà, dans ton compteur de virgules, lorsque tu croise la première virgule, tu n'implément plus la position ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(*ligne == ',') compteur ++;
     
          /* le else n'est pas necessaire */
    /*else   */
    		  ligne ++;
    Ensuite, l'allocation de memoire ne doit pas se faire dans la fonction chaine, ni la recher du nombre de virgules.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Gryzzly
    la fonction chaine à pour but de récupérer les lettres lues et de les mettres dans tab
    Définit le critère 'lettre'.

    Si tab est un tableau qui doit être vu de l'appelant, le plus simple est de l'allouer et de retourner son adresse

    Je conseille ce prototype :

    char *chaine (char const *ligne);

    et cette utilisation :
    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
     
    int main (void)
    {
       char const entree[] = " x       ,          z    ";
       char *tab = chaine (entree);
     
       if (tab != NULL)
       {
          printf ("%s\n", tab);
          free (tab), tab = NULL;
       }
       else
       {
          printf ("erreur \n");
       }
     
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Luther13
    Déjà, dans ton compteur de virgules, lorsque tu croise la première virgule, tu n'implément plus la position ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(*ligne == ',') compteur ++;
     
          /* le else n'est pas necessaire */
    /*else   */
    		  ligne ++;
    Ensuite, l'allocation de memoire ne doit pas se faire dans la fonction chaine, ni la recher du nombre de virgules.
    Merci de toutes vos remarques.
    Voila le programme corrige et qui fonctionne.
    Maitenant,je voudrais savoir si le code peut etre améliorer

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include<stdio.h>
    #include<ctype.h>
    #include<stdlib.h>
     
     
    int compteVirgules(char *ligne)
    {
      int compteur = 0;
     
      while(*ligne != '\0')
        {
     
          if(*ligne == ',') compteur ++;
          ligne ++;
        }
      return (compteur + 1); 
    }
     
     
    int chaine(char *ligne,char *tab)
    {
      char lettre; 
      int i=0;  
     
      while(*ligne == ' ') ligne ++;
     
     
      while(*ligne != '\0')
        {
          if(!(isalpha(*ligne))) return 1;
     
          sscanf(ligne,"%c",&lettre);
          ligne ++;
          tab[i++] = lettre;
     
          while(*ligne == ' ' || *ligne == ',') ligne ++;
        }     
      return 0;
    }
     
     
     
    int main(void)
    {
      int i;
      char entree[] = " x       ,          z    ";
      char*tab;  
     
      int nb_virgules = compteVirgules(entree);
     
      tab = (char*)malloc(sizeof(char)*nb_virgules);
      if(tab == NULL) return 1;
     
     
      if(chaine(entree,tab))
        {
          printf("erreur \n");
          return 1;
        }
     
      printf("%c",tab[0]);
     
      if(nb_virgules >1 )
        {
          for(i=1 ;i< nb_virgules; i++)
    	printf(",%c",tab[i]);
        }
      printf("\n");
     
      return 0;
    }

  18. #18
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Voici quelques remarques:

    Dans compteVirgules...

    Initialise compteur à 1 et modifie ton return...

    ---------------------------

    Dans chaine...

    Ton test
    Voir la remarque sur le main sur le problème des noms de variable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          sscanf(ligne,"%c",&lettre);
          ligne ++;
          tab[i++] = lettre;
    Pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       tab[i++] = *ligne;
    La ligne:
    sera gérée par ton while...

    ---------------------------

    Dans ton main...

    A cause de ton allocation de tab, tes variables ne peuvent être qu'une seule lettre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tab = (char*)malloc(sizeof(char)*nb_virgules);
    Tu ne testes pas le cas où il n'y a pas d'arguments donc cet endroit est problématique...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%c",tab[0]);
    Ce test est inutile, le test dans le for le gère parfaitement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(nb_virgules >1 )

    Jc

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Gryzzly
    Voila le programme corrige et qui fonctionne.
    Non, il ne fonctionne pas.

    Ceci fonctionne de façon sûre (mais je ne sais toujours pas ce que tu veux faire...).
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #include<stdio.h>
    #include<ctype.h>
    #include<stdlib.h>
     
    /* instrumentation */
    #include<assert.h>
    #include<string.h>
     
    static int compteLettres (char const *ligne)
    {
       int compteur = 0;
     
       while (*ligne != 0)
       {
          if (*ligne != ' ')
             compteur++;
          ligne++;
       }
       return compteur;
    }
     
    static int chaine (char const *ligne, char *tab, size_t size)
    {
       size_t i = 0;
     
       while (*ligne == ' ')
          ligne++;
     
       while (*ligne != '\0')
       {
          if (!(isalpha (*ligne)))
             return 1;
          {
             int lettre = *ligne;
             ligne++;
     
             assert (i < size - 1);
             tab[i] = lettre;
          }
          i++;
     
          while (*ligne == ' ' || *ligne == ',')
             ligne++;
       }
     
       tab[i] = 0;
       return 0;
    }
     
    int main (void)
    {
       char const entree[] = " x       ,          z    ";
     
       int nb_lettres = compteLettres (entree);
     
       if (nb_lettres != 0)
       {
          size_t const size = nb_lettres + 1;
          char *tab = malloc (size);
     
          if (tab != NULL)
          {
             memset (tab, '?', size);
     
             if (chaine (entree, tab, size))
             {
                printf ("erreur \n");
                return 1;
             }
     
             if (nb_lettres > 1)
             {
                printf ("'%s'\n", tab);
             }
     
             free (tab), tab = NULL;
          }
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je viens de voir que tout ce que tu veux c'est enlever les espaces en fait...

    Pourquoi ne pas faire simplement:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include<stdio.h>
    #include<ctype.h>
    #include<stdlib.h>
    #include<string.h>
     
    /*
     Fonction qui retourne une copie de la chaine de caracteres passee en argument sans les espaces...
    */
     
    char* enleve_espaces(const char *s)
    {
    int idx,cpidx;
     
    int size = strlen(s);  //Taille de la chaine
    char *res;
     
    //Si la chaine est vide
    if(!size)
       return NULL;
     
    //Allocation
    res = malloc(size);
    if(res==NULL)
    	return NULL; //Si erreur
     
    for(idx=0,cpidx=0;idx<size;idx++)
    	{
    	if( (isalpha(s[idx])) || (s[idx]==','))  //Si c'est une lettre ou une virgule
    		{
    		res[cpidx] = s[idx];
    		cpidx++;
    		}
    	else if( s[idx] != ' ') //Sinon cela peut encore etre une virgule, mais sinon c'est une erreur!
    		{
    		//Sinon erreur
    		free(res);
    		return NULL;  //On rend NULL
    		}
    	}
     
    //Le '\0' à la fin
    res[cpidx] = '\0';
    return res;
    }
     
    int main (void)
    {
       char const entree[] = " x  ,  y      ,          z    ";
       char *test;
     
       test = enleve_espaces(entree);
     
       if(test)
    	   {
    	   printf("%s\n",test);
    	   free(test);
    	   }
     
       return 0;
    }

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

Discussions similaires

  1. Probleme avec l'utilisation du sscanf
    Par Flow_75 dans le forum C
    Réponses: 3
    Dernier message: 03/06/2010, 09h05
  2. [Débutant(e)] Comment utiliser Scanf.sscanf
    Par bumbolol dans le forum Caml
    Réponses: 2
    Dernier message: 02/02/2009, 16h04
  3. Utilisation de la fonction sscanf()
    Par Substantiel dans le forum Langage
    Réponses: 4
    Dernier message: 26/11/2006, 19h40
  4. Meilleure utilisation de sscanf
    Par Gryzzly dans le forum C
    Réponses: 4
    Dernier message: 19/12/2005, 12h33
  5. Réponses: 4
    Dernier message: 12/09/2003, 11h38

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