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 :

passer de char* en tableau de int


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2021
    Messages : 1
    Points : 2
    Points
    2
    Par défaut passer de char* en tableau de int
    Bonjour,
    j'aimerais passer d'une chaine de caractères de type " 12 45 2 8 " à une liste d'entiers. je pense qu'il faut utiliser sscanf mais je sais pas comment
    merci en avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    le premier point à résoudre c'est le nombre de passes et le container pour stocker les valeurs.

    Si tu optes pour 1 stockage "fixe" (comme 1 tableau par exemple), alors il te faut 1 algo en 2 passes : 1 pour calculer le nombre de valeurs, 1 pour le stockage (après avoir fait l'initialisation de ton stockage)
    Si tu optes pour 1 stockage dynamique (comme 1 tableau dynamique ou 1 liste [doublement] chainée par exemple), alors il te faut seulement 1 passe.

    Ensuite pour répondre à ta question sscanf. Le problème, c'est que tu ne connais pas le nombre de valeurs dans ta chaîne
    Tu peux éventuellement contruire le format lors d'1 ou plusieurs passes, mais comment passer 1 nombre variable de valeurs ?
    En C, il y a l'ellipse (documentation cplusplus.com de l'entête stdarg.h en anglais)
    Mais cela semble foireux

    Il faut faire 1 machine à états :
    *) debut : c'est l'état space
    Ensuite il faut statuer si 1 chaine vide/ avec que des espaces est 1 erreur ou pas. Si c'est 1 erreur, le début est 1 état space avec la fin de tableau qui passe à l'état error.

    *) état number : tant qu'on a 1 chiffre, on continue.
    Si on a 1 espace, on passe à l'état space
    Si on a 1 fin de tableau, on a fini.
    Tout autre caractère, on passe à l'état error
    Ici la formule mathématique est : on prend 1 chiffre X, le nombre qu'on extrait vaut current_nombre = ((current_nombre * 10) + X) (par défaut, current_nombre=0).

    *) état space : tant qu'on a 1 espace, on continue.
    Si on a 1 chiffre, on passe à l'état number
    Si on a 1 fin de tableau, on a fini.
    Tout autre caractère, on passe à l'état error

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    La donnée importante en effet est la gestion d'un nombre variable données à lire. Si par contre le nombre est fixe et qu'il y en a peu, on peut tout à fait utiliser sscanf().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char buffer_in[] = " 12 45 2 8 ";
    int tab[4];
    sscanf( buffer_in, "%d%d%d%d", tab, tab+1, tab+2, tab+3 );
    Sinon tu devras traiter les nombres un par un et en stocker le résultat.
    Dans ce cas tu as la fonction strtol() qui fait presque tout le boulot indiqué par foetus. Elle sait sauter les espaces, sait extraire le nombre entier et sait dire où dans la chaîne le nombre se termine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int  index = 0;
    const char*  pos = buffer_in; // on part du début de la chaîne
    for (;;)  {
        char**  la_fin;
        while ( pos == ' ' )      // se placer au début du prochain nombre
            ++pos;
        int  valeur_lue = strtol( pos , &la_fin, 10 );
        if ( str_end == pos )     // pas vu de nombre entier; c'est fini
            break;
        tab[index++] = valeur_lue;
        pos = la_fin;             // se positionner sur la suite à lire
    }
    Si on ne connaît pas le nombre maximum de données à lire, un simple tableau ne pourra pas être utilisé. Il te faut faire de l'allocation dynamique. Là ça peux devenir complexe en fonction de ton besoin. Tu peux par exemple :
    - effectuer toute la lecture sans jamais stocker la valeur_lue. A la fin tu as le nombre dans index, tu peux faire l'allocation nécessaire, et tu recommences et cette fois tu peux stocker tes valeur_lue.
    - compter le nombre d'espaces et en déduire le nombre d'éléments avant de les lire. Méthode piégeuse, y a-t-il des espaces au début, à fin, plusieurs successifs?
    - extraire les données successivement et réallouer à chaque fois le tableau résultat avec la fonction realloc().

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Dans ce cas tu as la fonction strtol()
    Effectivement, je suis resté sur la fonction sscanf sans chercher + loin
    On peut faire 1 boucle avec la fonction strtol : il reste à tester la gestion des espaces, et notamment en début de chaîne.
    documentation de la fonction strtol sur cplusplus.com en anglais


    Citation Envoyé par dalfab Voir le message
    extraire les données successivement et réallouer à chaque fois le tableau résultat avec la fonction realloc().
    Je parle de tableau dynamique qui ajoute X éléments à la fin lorsqu'il est plein (avec 1 realloc)
    Réallouer le tableau 1 élément par 1 élément ne me semble pas très efficace

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Si tu n'as pas peur de perdre ta string intiale, tu peux utiliser strtok_r(). Comme je le dis, son inconvénient est qu'elle modifie la string qu'elle traite et donc en fin de traitement, la string initiale n'est plus du tout ce qu'elle était. Accessoirement la string soit impérativement être modifiable (interdit de traiter par exemple un char *buffer_int=" 12 45 32 8 ").

    Mais si tout ça ne te gêne pas, alors cette fonction est bien pratique. Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <string.h>
     
    int main() {
    	char buffer_int[]=" 12 45 32 8 ";
    	char *pt;
    	char *w;
     
    	for (pt=strtok_r(buffer_int, " ", &w); pt != NULL; pt=strtok_r(NULL, " ", &w)) {
    		printf("[%s]\n", pt);
    	}
    }
    A la place de printf() tu peux utiliser ensuite strtol().
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Passer un tableau de int en paramètre à une fonction
    Par .....1..... dans le forum Débuter
    Réponses: 14
    Dernier message: 04/11/2019, 18h12
  2. Réponses: 5
    Dernier message: 21/06/2013, 12h26
  3. [Débutant] Passer un tableau d'int à jQuery
    Par same66 dans le forum C#
    Réponses: 3
    Dernier message: 27/10/2011, 09h06
  4. [Langage] Passer par reference un tableau de int
    Par sn@ke51 dans le forum Langage
    Réponses: 10
    Dernier message: 03/12/2008, 11h02
  5. problème our passer des string dans tableau d'int
    Par Battosaiii dans le forum C++
    Réponses: 9
    Dernier message: 15/07/2004, 17h42

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