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 :

Isoler le chiffre d'un nombre


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut Isoler le chiffre d'un nombre
    Bonjour à tous,

    J'ai besoin d'une fonction permettant d'isoler le chiffre d'un nombre.

    Celle ci aurait pour paramètre d'entrée:
    - Le nombre (qui est concrètement un char, avec une valeur exprimée en hexa)
    - La position, dans le nombre, du chiffre à isoler

    Ex: Chiffre1=MaFonction(0x32,1);
    Chiffre1 serait égal à 3

    Je ne souhaite pas utiliser les modulo et co.
    Pour le bien, il faudrait mettre le nombre dans un tableau de char (sprintf), puis récupérer et retourner la valeur de la case correspondante à la position.

    N'étant pas vraiment à l'aise (pas du tout même) avec les chaînes, pointeurs & co, j'appelle à l'aide pour créer cette fonction.

    Merci d'avance pour votre aide,

    Nicolas

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char buffer[128];
     
    snprintf (buffer,sizeof(buffer),"%d",nombre);
    chiffre1 = buffer[position] - '0';

    Ça reste une bidouille très sale. Le mieux reste quand même les modulos. Apprendre l'arithmétique des nombres en informatique est un meilleur investissement.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    heu ... c'est plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf (buffer,"%d",nombre);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    snprintf (buffer,sizeof(buffer),"%d",nombre);
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    Par défaut
    C'est bien snprintf() que je voulais poster.

    Corrigé, merci.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 962
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 962
    Par défaut
    Gia,
    Citation Envoyé par Obsidian Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char buffer[128];
     
    snprintf (buffer,sizeof(buffer),"%d",nombre);
    chiffre1 = buffer[position] - '0';

    Ça reste une bidouille très sale. Le mieux reste quand même les modulos. Apprendre l'arithmétique des nombres en informatique est un meilleur investissement.
    +1000

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Bonjour à tous,

    Tout d'abord, merci à tous pour votre aide et réactions.

    J'ai essayé cette solution, et ça fonctionne presque ^^

    En fait, lorsque l'on fait le snprintf, la valeur mise dans le buffer est en décimal, et non en hexadécimal, ce qui ne me retourne pas un chiffre correct vis à vis du nombre original, mais un bon chiffre vis à vis de sa valeur en décimal...

    J'ai donc passé le paramètre %x dans le snprintf:
    snprintf (buffer,sizeof(buffer),"%x",nombre);

    J'ai aussi géré le cas où le nombre est inférieur à 10 (décalage de 1).

    Donc, ça fonctionne. Mais à la compilation, j'ai
    "Warning: Incompatible implicit declaration of built-in function 'snprintf'"

    Pouvez vous m'éclairer sur cette alerte?

    Hm si ce n'est pas propre de faire de cette manière, je vais jeter un œil du coté des modulo...

    Merci encore

    Nico

  7. #7
    Membre très actif

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 582
    Par défaut
    Je n'est pas bien compris le problème, l'entête de ta fonction serait

    unsigned int MaFonction(const char * chaine, unsigned int ieme_char) ?

    Si c'est le cas, et que donc chaine représente un nombre en hexa décimale tu a de la chance, Il faut profiter du fait que un caractère hexa (0 1 2 3 4 5 6 7 8 9 A B C D E F), est représentable sur 4 bits.

    Il faut dans un premier temps convertir ta chaine en un entier non signé (unsigned int) et appliquer un masque de 4 bits (genre 0xF) sur cette entier avec l'opérateur logique 'et' cad &.
    Avec ce masque et des décalages tu dois pouvoir t'en sortir.
    Le problème que ici ieme_char correspond aux bits de poids forts si il vaut 1 et non sur les bits de poids faible. il faut faire gaff à ca.

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Hello,

    Voici ma fonction:

    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 GetDigit(char number, int position) {
    	char buffer[128];
    	char digit;
     
    	snprintf (buffer,sizeof(buffer),"%x",number);
     
    	if (number < 10) 
    		{
    		if (position == 0) digit = 0x00;
    		else digit = buffer[position-1]-'0';
    		}	
    	else digit = buffer[position]-'0';
     
    	return digit;
    }
    Mith06, le fonction fonctionne, mais a la compilation, il y a un warning (cf post precedent)

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    Par défaut
    Citation Envoyé par K_t_u_l_u Voir le message
    Donc, ça fonctionne. Mais à la compilation, j'ai
    "Warning: Incompatible implicit declaration of built-in function 'snprintf'"
    En tête de fichier.

  10. #10
    Membre très actif

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 582
    Par défaut
    snprintf est déclarée dans stdio.h.

    As-tu pensé à faire #include <stdio.h> ? (question a deux balles)

    Oups.. pas le temps d'écrire mon poste que quelqu'un à déjà répondu....

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Oui, stdio.h est bien déclaré en tête de fichier

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Erreur

  13. #13
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par K_t_u_l_u Voir le message
    Erreur
    Correction?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Non non c'est juste un post où j'ai écris une bêtise
    J'ai toujours cet avertissement à la compilation

    Précision qui peut être utile: je programme pour un micro-contrôleur PIC24.

  15. #15
    Membre très actif

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 582
    Par défaut
    je programme pour un micro-contrôleur PIC24.
    Effectivement ce n'est pas négligeable comme indication...

    Il faut voir ce qu'il a a dans le stdio.h fournit avec l'environnement de développement pour ton PIC (voir même si il existe). Personnellement sur un PIC j'oublierai les fonction associées a printf (sprintf, snprintf etc..)

    Je reviens sur mon précédent poste, j'essaierai de m'en sortir avec des masques et des décalages.

    A toi de voir.

Discussions similaires

  1. Comment rechercher un chiffre dans un nombre ?
    Par christophe_halgand dans le forum MATLAB
    Réponses: 5
    Dernier message: 05/01/2008, 10h52
  2. Séparer les différents chiffres d'un nombre
    Par Sandro Munda dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/10/2006, 18h48
  3. Réponses: 2
    Dernier message: 18/07/2006, 11h40
  4. Réponses: 11
    Dernier message: 18/07/2006, 11h03
  5. Récupérer 1er chiffre d'un nombre dans une requête
    Par beletteroi dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 26/06/2006, 13h33

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