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 :

sscanf d'un string vers un tableau


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Points : 46
    Points
    46
    Par défaut sscanf d'un string vers un tableau
    Bonjour

    Je dispose de string de la forme "34 42 23.." en tout 10 chiffres séparés par 1 espace
    je veux les mettre dans un tableau int t[10]
    en evitant sscanf(le_string,"%d %d...",t,t+1,...);
    car pour 10 ça peut encore aller mais pour plus c'est horrible

    comment faire avec une boucle
    char* p=le_string;
    for i =0 à 9 sscanf(p,"%d ",t+i) échoue
    merci

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Avec tes noms de variables, je ferais une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=0;i<10;i++)
    {
        sscanf(p,"%d",tab+i);
        if (p = strchr(p,' ')) p++;
    }
    Ce sont les espaces qui séparent tes valeurs qui n'étaient pas gérés.

  3. #3
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    strtol() le fait très bien :
    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
     
    #include  <stdio.h>
    #include  <stdlib.h>
     
    #define TABSIZE 10
     
    int main( void )
    {
    	char *str = "1 2 3 4 5 6 7 8 9 10";
    	char *p = str;
    	char *end;
    	int tab[TABSIZE] = {0};
    	size_t i=0;
     
    	for( i=0 ; i<TABSIZE ; i++ ) {
    		tab[i] = strtol(p, &end, 10);
    		p = end;	
    	}
     
    	return 0;
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Avec tes noms de variables, je ferais une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=0;i<10;i++)
    {
        sscanf(p,"%d",tab+i);
        if (p = strchr(p,' ')) p++;
    }
    Ce sont les espaces qui séparent tes valeurs qui n'étaient pas gérés.
    c'est justement ce que j'avais fait au debut mais ça marche pas , sscanf(p,"%d",tab+i); marche pas car le caractère fin '\0' est attendu juste après le premier chiffre mais c'est un caractère espace qu'il y a
    à moins de remplacer les espaces par des fins au fur et à mesure mais c'est embetant


    ssmario2 merci pour strtol je connaissais pas, est ce que cette fonction est performante parceque les données que j'utilise doit etre lues le plus vite possible sinon j'ai des erreurs quelquefois (lecture port série)

  5. #5
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par ____22 Voir le message
    c'est justement ce que j'avais fait au debut mais ça marche pas , sscanf(p,"%d",tab+i); marche pas car le caractère fin '\0' est attendu juste après le premier chiffre mais c'est un caractère espace qu'il y a
    à moins de remplacer les espaces par des fins au fur et à mesure mais c'est embetant
    Désolé mais c'est n'importe quoi.
    Le "sscanf(%d,...)" n'a absolument pas besoin qu'un '\0' suive ton chiffre pour fonctionner correctement : l'espace fait TRES bien l'affaire et le "décodage" de ton entier s'arrête (essaye). D'ailleurs, c'est le même principe qu'avec strtol qui s'arrête sur le premier caractère qui ne peut être interprété selon le format spécifié.

    Dans le code que tu proposais, ton pointeur p n'était jamais avancé et pointait désespérément sur le début de ta chaine tout au long de la boucle.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Désolé mais c'est n'importe quoi.
    Le "sscanf(%d,...)" n'a absolument pas besoin qu'un '\0' suive ton chiffre pour fonctionner correctement : l'espace fait TRES bien l'affaire et le "décodage" de ton entier s'arrête (essaye). D'ailleurs, c'est le même principe qu'avec strtol qui s'arrête sur le premier caractère qui ne peut être interprété selon le format spécifié.

    Dans le code que tu proposais, ton pointeur p n'était jamais avancé et pointait désespérément sur le début de ta chaine tout au long de la boucle.
    ok ça devait etre autre chose qui avait fait buggé
    mais juste un truc on peut pas mettre ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (i=0;i<10;i++)
    {
        p+=sscanf(p,"%d ",tab+i);
    }

  7. #7
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Non : la doc annonce, concernant le code retour de la famille des ..scanf : "These functions return the number of input items assigned" donc ici, 1 à chaque fois, ce qui ne te renseigne pas sur le nombre de caractères à passer

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Le plus simple dans ce cas est encore d'utiliser strtol(), encore faut il savoir s'en servir correctement :
    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 <errno.h>
    #include <limits.h>
    #include <stdlib.h>
     
    #define MAX_ELEM 10
     
    int main(void)
    {
       char const * str = "1 2 3 4 5 6 7 8 9 10";
       long results[MAX_ELEM] = {0};
       unsigned int nb_founds = 0;
     
       while(*str != '\0'  &&  nb_founds < MAX_ELEM)
       {
          char * endptr = NULL;
          long result = strtol(str, &endptr, 10);
     
          if(endptr == str)
          {
             str++;
          }
          else if((result == LONG_MIN  ||  result == LONG_MAX)  &&  errno == ERANGE)
          {
             str = endptr;
          }
          else
          {
             results[nb_founds] = result;
             nb_founds++;
             str = endptr;
          }
       }
     
       printf("found %u integer%s :\n", nb_founds, nb_founds > 1 ? "s" : "");
     
       for(unsigned int i = 0; i < nb_founds; i++)
       {
          printf("%ld\n", results[i]);
       }
     
       return 0;
    }
    Cordialement.

Discussions similaires

  1. [vb6]Convertir de String vers tableau de char et inversement!
    Par sohaieb dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/05/2013, 17h38
  2. JSON : envoi de tableau de String vers le Javascript
    Par Nicolas74100 dans le forum Général JavaScript
    Réponses: 27
    Dernier message: 02/10/2010, 20h47
  3. [STRING]Contenu d'un String <> vers &lt; et &g
    Par TreizeSegments dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/08/2004, 08h37
  4. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  5. Réponses: 2
    Dernier message: 30/05/2002, 10h19

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