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 :

concaténation de char et float


Sujet :

C

  1. #1
    gup
    gup est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Points : 28
    Points
    28
    Par défaut concaténation de char et float
    Bonjour,

    Voilà, je voudrais lire un caractere, et s'il est différent de touche ENTER, je remplis une variable de type float avec. Le probleme est que le resultat de la concaténation est faux.

    voici ce que je fais :

    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
     
    char buf_somme[32];
    char buf_touche[64];
    int touche;
    float fr;
     
    do{
        touche=getch();
        if(touche!=ENTER){
            sprintf(buf_somme,"%f",fr);
            sprintf(buf_touche,"%s%c",buf_somme,touche);
            sscanf(buf_touche,"%f",&fr);
        }
    }while(touche!=ENTER);
     
    printf("%f",fr);
    Quelqu'un pourrait-il me dire ce qui ne vas pas s'il vous plait ?


    cordialement

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    je remplis une variable de type float avec.
    Ou fais tu celà ???

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: concaténation de char et float
    Bonjour,
    Citation Envoyé par gup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            sprintf(buf_somme,"%f",fr);
            sprintf(buf_touche,"%s%c",buf_somme,touche);
            sscanf(buf_touche,"%f",&fr);
    Je ne suis pas sur que ça soit la suite logique
    Il ne vaut pas mieux donner une valeur à fr pour ensuite l'utiliser ?

    De plus la fonction scanf est à éviter :
    Saisie de données par un opérateur (stdin)
    La fonction scanf démystifiée

  4. #4
    gup
    gup est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    je cherche à faire, faute d'avoir trouver mieux, ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Je converti le float (fr) en char dans buf_somme
    sprintf(buf_somme,"%f",fr);
    // Je concatene buf_somme et le caractere tapé (touche) et je stocke dans buf_touche
    sprintf(buf_touche,"%s%c",buf_somme,touche);
    // Je converti la chaine de caractere buf_touche en float pour remettre dans fr, pour pouvoir faire du calcul dessus
            sscanf(buf_touche,"%f",&fr);

  5. #5
    gup
    gup est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Il ne s'agit pas de scanf mais bien de sscanf

    J'ai oublié de préciser que la variable fr = 0 à l'init.


  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Et quel est le but de ce code ?
    C'est uniquement pour récupérer un nombre réel tapé au clavier ?

  7. #7
    gup
    gup est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    bah en fait, ce code est intégré dans une petite appli avec la lib ncurses. J'ai fais un menu que l'on peut accéder grace aux touches Fonctions. Le probleme, c'est que si je met un scanf, pendant le temps de la saisie, les touches Fonction ne répondent plus, donc on ne peux plus accéder au menu. Je ne savais pas trés bien comment contourner le probleme, et ceci pourrait etre une solution.

    Si quelqu'un a une idée pour faire marcher ce bout de code, ou alors pour contourner mon probleme d'une maniere différente, je suis preneur.

    cordialement

  8. #8
    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
    Pour ce genre de code, il faut faire une boucle
    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
    virgule_lue <- 0
    chiffre_apres_virgule <- 0
    nombre_lu <- 0
    tant que caractère_lu est différent de "Enter"
      si caractère_lu est un chiffre alors
        si virgule_lue == 0 alors
          nombre_lu <- nombre_lui * 10 + caractère_lu - '0'
       sinon
          nombre_lu <- (nombre_lu * 10 ^chiffre_apres_virgule + caractère_lu - '0') / 10 ^(chiffre_apres_virgule + 1)
         chiffre_apres_virgule <- chiffre_apres_virgule + 1
       fin si
      sinon
        si caractère_lu == '.' et virgule_lue == 0 alors
          virgule_lue = 1
        sinon
           afficher message d'erreur
       fin si
    fin tant que
    caractère_lu peut-être la fonction getchar() ou quelque chose comme ça.
    "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

  9. #9
    gup
    gup est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    merci beaucoup pour cette algo. J'ai essayé de le mettre en pratique, mais je ne connaissais pas les expressions régulieres en C. Ceci m'affiche toujours 00.00 pour fr :

    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
     
    int choix;
    float fr=0;
    float eu=0;
     
    int vir_lu=0;
    int nb_after_vir=0;
    int nb_lu=0;
    int err;
    regex_t preg;
    int match;
    char *str_regex="[:digit:]";
    int buf_touche_int=0;
    char buf_touche[64];
    int touche=0;
    err=regcomp(&preg,str_regex,REG_NOSUB | REG_EXTENDED);
    if (err==0){
        do{
            touche=getch();
            sprintf(buf_touche,"%d",touche);
            sscanf(buf_touche,"%d",&buf_touche_int);
            match=regexec(&preg,buf_touche,0,NULL,0);
            if(match==0){
                if(vir_lu==0){
                    fr=(fr*10)+(buf_touche_int/10);
                }else{
                    fr=((fr*pow(10,nb_after_vir))+(buf_touche_int/10))/pow(10,nb_after_vir+1);
                    nb_after_vir++;
                }
            }else{
                if(buf_touche_int=='.' && vir_lu==0){
                    vir_lu=1;
                }
            }
        }while(touche!=ESCAPE && touche!=KEY_F(1) && touche!=KEY_F(2) && touche!=ENTER);
        regfree(&preg);
        printw("\n%f",fr);
    gcc ne m'annonce pas d'erreur, mais ca ne fonctionne pas. :s

    ps : je n'est pas tout fait pris les même nom de variable.

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Les lignes ou tu modifies fr sont les suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fr=(fr*10)+(buf_touche_int/10);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fr=((fr*pow(10,nb_after_vir))+(buf_touche_int/10))/pow(10,nb_after_vir+1);
    Or tu initialises fr comme ceci :

    L'élément neutre de la multiplication est 1 et pas 0. L'erreur ne vient probablement pas du C mais de l'algo utilisé.

    essaie avec ça :


  11. #11
    gup
    gup est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    oui, merci, ca fonctionne avec fr=1. J'avais pas fait attention à l'erreur mathématique! :s

    merci

  12. #12
    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
    Ceci fonctionne très bien, j'avais simplement mal initialisé le nombre de chiffre après la virgule :
    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
    #include <stdio.h>
    #include <ctype.h>
    #include <math.h>
     
     
    int main(void)
    {
    	double f = 0.0;
    	int virgule_lue = 0;
    	int dec = 0;
    	int c;
     
    	while ((c = getchar()) != '\n')
    	{
    		if (isdigit(c))
    		{
    			if (virgule_lue == 0)
    			{
    				f = f * 10.0 + c - '0';
    			}
    			else
    			{
    				f = (f * pow(10, dec) + c - '0') / pow(10, dec);
    				dec++;
    			}
    		}
    		else
    		{
    			if (c == '.')
    			{
    				dec = 1;
    				virgule_lue = 1;
    			}
    		}
    	}
    	printf("%lf\n", f);
       return 0;
     
    }
    "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

Discussions similaires

  1. concaténation d'un tableau de char en float
    Par tymop dans le forum Débuter
    Réponses: 5
    Dernier message: 22/03/2009, 22h37
  2. Réponses: 5
    Dernier message: 20/03/2009, 18h16
  3. concaténation de char*
    Par Jérémy Lefevre dans le forum C
    Réponses: 58
    Dernier message: 11/11/2006, 10h12
  4. [C++] Concaténer un char[50] avec un int
    Par Invité4 dans le forum C++
    Réponses: 10
    Dernier message: 07/04/2006, 14h54
  5. type d'un char* ? int, float .... ?
    Par stitch dans le forum C
    Réponses: 5
    Dernier message: 08/03/2006, 16h27

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