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 :

Récupérer une chaine de caractères, puis la convertir en réel


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut Récupérer une chaine de caractères, puis la convertir en réel
    Bonjour,

    après plusieurs jours de recherches et de test de (surtout) d'échecs. j'ai décidé de poster sur le forum mon problème.

    En effet, j'ai un TP en cours d'info à rendre : calculatrice en C.
    seulement c'est notre 1er et dernier TP !
    donc je (re)découvre le C après plusieurs années de non utilisation.

    Mon souhait est de récupérer une chaine de caractères contenant 2 opérandes et l'opérateur.
    Donc j'ai pour idée :
    - récupérer une chaine de caractères;
    - d'identifier l'opérateur;
    - d'identifier l'opérande 1 et l'opérande 2;
    - appeler la fonction réalisant l'opération demandée;
    - afficher le résultat;

    et pour réaliser tout cela, j'ai pour idée d'utiliser les fonctions du type :
    strtok, strcmp, atof
    seulement, je n'arrive vraiment pas à les utiliser !
    peut être est-ce du à DEV-C++ ?
    en tout cas je n'y arrive pas ...
    donc j'ai un bout de code à vous faire parvenir (exemple de l'addition):
    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
     
    	char chaine[54];
    	char chaine1[25];
    	char chaine2[25];
    	float op1,op2;
     
    int main()
    {
    	printf("CALC>");
    	scanf("%s",&chaine);
     
    	if(strcmp(chaine, "+") == 0)
    	{
    //	OPERATEUR[]="+";
    		chaine1=strtok(chaine,"+");
    		chaine2=strtok(NULL,"+");
    		OP1=atof(chaine1);
    		OP2=atof(chaine2);
    		printf ("CALC> %f", addition(OP1,OP2));
    	}
     
    	system("PAUSE");
    	return 0;
     
    }
    voilà si vous vouliez bien m'expliquer svp quels arguments prendre etc...
    j'ai des erreurs en compilant ... pour le +
    j'ai essayé de déclarer une variable PLUS="+", mais c'est pareil il n'accepte pas mon char PLUS ...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Par défaut
    Salut,

    strtok attend un caractère représenté par des '' et non une chaine de caractères représenté par "" (http://man.developpez.com/man3/strtok.3.php).

    Il y a un deuxième problème, tu ne passeras jamais dans ton if, car tu compares TOUTE ta chaine de caractères avec "+". Pour savoir si ta chaine contient le caractère '+', il faut utiliser la fonction strchr (http://man.developpez.com/man3/strchr.3.php).

    Bon courage

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Asta Voir le message
    Salut,

    strtok attend un caractère représenté par des '' et non une chaine de caractères représenté par "" (http://man.developpez.com/man3/strtok.3.php).
    Inexact, il attend bien une chaine de caractères

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    il n'y a pas de & devant chaine (qui est un tableau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strcmp(chaine, "+") == 0)
    Ce test est faux. Il regarde si chaine est identique à "+". Je suppose que tu voulais tester si '+' était présent dans la chaine. Utilise plutôt strchr(). (signalé par Asta)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		OP1=atof(chaine1);
    		OP2=atof(chaine2);
    Attention aux majuscules/minuscules

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    je n'y arrive vraiment pas...
    mon but est de : demander une chaine de caratères à l'utilisateur, et de l'utiliser
    mais tous les exemples que je vois sur internet sont des "strings" entré soi meme !
    et quand j'essaie de l'appliquer à mon tour pour mon exemple, cela ne fonctionne pas !
    j'ai écouté vos remarques et conseils, mais rien n'y fait ... les arguments sont toujours mauvais

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par mad.mimo Voir le message
    mon but est de : demander une chaine de caratères à l'utilisateur, et de l'utiliser
    mais tous les exemples que je vois sur internet sont des "strings" entré soi meme !
    Si ton problème concerne l'interprétation de la chaîne comme ton premier message le laisse penser, que la chaîne soit saisie ou dans le code n'a pas vraiment d'importance.

    Citation Envoyé par mad.mimo Voir le message
    et quand j'essaie de l'appliquer à mon tour pour mon exemple, cela ne fonctionne pas !
    j'ai écouté vos remarques et conseils, mais rien n'y fait ... les arguments sont toujours mauvais
    Que veut dire précisément "cela ne fonctionne pas" ? Erreur d'exécution ? De compilation ? Avec quels messages ? Etc.

    En outre peux-tu donner un code minimale, compilable et permettant de reproduire le problème qui intégre les remarques de diogene.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    alors gl voilà mon code :

    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
    //      DECLARATION DES BIBLIOTHEQUES
     
    #include <stdio.h>
    #include <string.h>
    #include <math.h> 
    #include <stdlib.h>
     
    //      DECLARATION DES FONCTIONS
     
    float addition (float op1, float op2)
    {
    	float temp_a; 
    	temp_a = op1+op2;
    	return temp_a;
    } 
     
    float soustraction (float op1, float op2)
    {
    	float temp_s;
    	temp_s=op1-op2;
    	return temp_s;
    } 
     
    float multiplication (float op1, float op2)
    {
    	float temp_m;
    	temp_m=op1*op2;
    	return temp_m;
    } 
     
    float division (float op1, float op2)
    {
    	float temp_d;
    	temp_d=op1/op2;
    	return temp_d;
    } 
     
    int main ()
    {
     
    	char chaine[54];
    	char chaine1[25];
    	char chaine2[25];
    	float op1,op2;
     
    {
    	printf("CALC>");
    	scanf("%s",&chaine);
     
    //	OPERATION D'ADDITION
    		chaine1=strtok(chaine,"+");
    		chaine2=strtok(NULL,"+");
     
    		OP1=atof(chaine1);
    		OP2=atof(chaine2);
     
    		printf ("CALC> %f", addition(op1,op2));
     
    	system("PAUSE");
    	return 0;
     
    }
    les erreurs retournées sous DEV C++ (c'est le seul compilateur que je connais) sont les suivantes :

  8. #8
    Invité de passage
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Par défaut
    Tu utilises OP1 / OP2 dans ton main alors que tu as défini comme variable op1 / op2 (attention à la case). Tu as une accolade inutile qui se balade dans ton main toujours.
    Regarde le prototypage de strtok : il prend un char * en paramètre, tu lui donne un char ; soit tu cast, soit tu défini comme variable des char * et tu malloc.
    Un souci aussi sur le scanf comme on te l'a déjà dit au dessus.

    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
    int main ()
    {
     
      char chaine[54];
      char *chaine1;
      char *chaine2;
      float op1,op2;
     
      printf("CALC>");
      scanf("%s",chaine);
     
      //OPERATION D'ADDITION
      chaine1 = chaine2 = malloc((25 + 1) * sizeof(char));
      chaine1 = strtok(chaine,"+");
      chaine2 = strtok(NULL,"+");
     
      op1=atof(chaine1);
      op2=atof(chaine2);
     
      printf ("CALC> %f\n", addition(op1,op2));
     
      system("PAUSE");
      return 0;
     
    }

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Kyotoweb Voir le message
    Regarde le prototypage de strtok : il prend un char * en paramètre, tu lui donne un char ; soit tu cast, soit tu défini comme variable des char * et tu malloc.
    Non, dans le code fourni, les paramètres de strtok() sont bien correct me semble-t-il.
    C'est la valeur de retour qui est mal géré.

    Citation Envoyé par Kyotoweb Voir le message
    [code]
    chaine1 = chaine2 = malloc((25 + 1) * sizeof(char));
    chaine1 = strtok(chaine,"+");
    chaine2 = strtok(NULL,"+");
    L'appel de malloc() est incorrect ici. En effet tu écrase la valeur de retour de malloc par les valeurs de retours de strtok. L'adresse de la mémoire allouée est donc perdue et cette mémoire n'est pas libérable.

    En outre :
    • Si tu avais voulu créer deux tableaux pour copier le retour de strtok, il aurait fallu faire deux malloc.
    • Il manque le test sur le retour de malloc et le free.
    • sizeof(char) vaut 1 par définition.

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par mad.mimo Voir le message
    alors gl voilà mon code :
    Dans lequel tu n'as pas apporté les corrections mentionnées par diogene :

    il n'y a pas de & devant chaine (qui est un tableau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    OP1=atof(chaine1);
    OP2=atof(chaine2);
    Attention aux majuscules/minuscules
    A part ça, il y a également une erreur aux lignes chaineX=strtok(...). En effet ici tu essaies d'affecter une adresse à un tableau ce qui n'est pas correct.
    Il faut :
    • Soit déclarer chaine1 et chaine2 comme étant des pointeurs.
    • Soit copier le retour de strtok dans les tableaux.


    EDIT :
    • Comme l'a fait remarquer Kyotoweb, il y a également une accolade en trop.
    • Il serait préférable de limiter la taille de la chaine attendue par scanf et tester le retour de scanf (ou d'utiliser une autre fonction de saisie).
    • Il peut être intéressant de tester le retour de strtok.

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

Discussions similaires

  1. [MySQL] Récupérer une chaine de caractère dans un colonne
    Par djdamage dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/07/2009, 15h40
  2. [RegEx] Récupérer une chaine de caractères
    Par lucke34 dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2009, 15h19
  3. [RegEx] Récupérer une chaine de caractéres par strpos
    Par bdptaki dans le forum Langage
    Réponses: 11
    Dernier message: 21/04/2009, 11h43
  4. Réponses: 5
    Dernier message: 22/06/2006, 17h19
  5. Récupérer une chaine de caractère dans une page
    Par BrunS dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2005, 14h28

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