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 :

Différence entre sscanf et simple assignation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut Différence entre sscanf et simple assignation
    Bonjour,

    J'ai repris un code d'un livre utilisant sscanf, code qui marche, mais lorsque je remplace cette instruction par une simple assignation, j'obtient un mauvais résultat, voici le 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <getopt.h>
     
    int main(int argc, char ** argv){
     
    	int vitesse_lecture = 0;
     
    	if(argc < 2){	//Trop peu d'arguments
    		fprintf(stderr, "Trop peu d'arguments\n");
    		return 1;
    	}
     
    	char * optstring = "d:f:";
     
    	struct option longopts[] = {
     
    		/* name		has_arg	flag		val	*/
     
    		{ "debut",	1,	NULL,		'd' },
    		{ "fin",	1,	NULL,		'f' },
    		{ "rapide",	0,	&vitesse_lecture, 1 },
    		{ "lent",	0,	&vitesse_lecture, -1},
     
    		/* Le dernier élément doit etre nul */
     
    		{ NULL,		0,	NULL,		 0  },
    	};
     
    	int longindex;
     
    	int option;
     
    	int debut = 0;
    	int fin = 999;
     
    	while((option = getopt_long(argc, argv, optstring,
    			longopts, &longindex)) != -1){
     
    		switch(option){
     
    			case 'd':
    				fprintf(stdout, "optarg = %d\n", *optarg);
    				//debut = *optarg;
    				sscanf(optarg, "%d", &debut);
    				break;
     
    			case 'f':
    				fprintf(stdout, "optarg = %d\n", *optarg);
    				//fin = *optarg;
    				sscanf(optarg, "%d", &fin);
    				break;
     
    		}
    	}
     
    	fprintf(stdout, "Vitesse %d, debut %d, fin %d\n",
    			vitesse_lecture, debut, fin);
     
    	return 0;
    }
    Celui ci fonctionne, lors de l’exécution j'obtiens quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $./test_getopt_long -d525
    optarg = 53
    Vitesse 0, debut 525, fin 999
    $
    Mais si je commente les sscanf et que je dé-commente les assignations "classiques", j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $./test_getopt_long -d525
    optarg = 53
    Vitesse 0, debut 53, fin 999
    $
    En fait, je ne comprend pas pourquoi optarg contient 53 alors que l'argument est 525, et encore moins pourquoi le sscanf fonctionne du coup.
    Quelqu'un peut m'expliquer ?

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    optarg est de type char*, dans ton cas il s'agit de "525".

    Dans le cas sscanf, tu demandes à lire dans la chaine optarg un entier et à en mettre la valeur dans debut. Tout se passe bien tu récuperes 525 dans debut.

    Dans le cas de l'assignation, debut=*optarg, tu déréférences optarg pour obtenir un char, en l'occurence '5' dont le code ascii est 53, et c'est cette valeur que tu stockes dans debut : c'est une erreur de vouloir faire ainsi.

    La manière la plus simple pour toi est effectivement d'utiliser le sscanf et d'en vérifier le retour (que se passe-t-il si un utilisateur donne -d T12 ?).

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut
    D'accord, du coup j'ai tout de même essayé via une simple assignation avec un cast en int et ça marche aussi, et -d T12 retourne 84 si je ne fait pas de cast, 84 correspondant bel et bien à 'T' en code ASCII.

    Merci pour cette explication claire et rapide :-)

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

Discussions similaires

  1. Différence entre une association simple et double
    Par antoine2641 dans le forum Merise
    Réponses: 7
    Dernier message: 16/05/2013, 19h30
  2. [Débutant] Différences entre 2 classes simples - Clés étrangeres
    Par alex_vino dans le forum Entity Framework
    Réponses: 3
    Dernier message: 16/11/2012, 08h43
  3. Différences entre if à condition simples et conditions multiples
    Par Jimalexp dans le forum Langages de programmation
    Réponses: 15
    Dernier message: 20/01/2009, 07h24
  4. Différence entre une image simple et une image 3D
    Par katebe dans le forum Traitement d'images
    Réponses: 9
    Dernier message: 29/08/2008, 18h03
  5. Réponses: 3
    Dernier message: 21/03/2008, 09h45

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