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 :

Problème avec sscanf


Sujet :

C

  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut Problème avec sscanf
    Bonjour,

    J'ai un soucis incompréhensible avec sscanf :/
    Je charge des données dans un fichiers de configuration (un fichier texte quoi!) et tout va bien sauf avec quelques variables et je vois pas d'ou çà peut provenir.
    Voilà le bout de code en question:
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    /*main: déclarations et appelle*/
     char *ip;
     char *nick;
     char *chan;
     char *msg;
     char *host;
     char *user;
     char *op;
     int sql, acc, reg, undo;
     unsigned int port;
     
    i = loadconf (&ip, &port,  &host, &user, &nick, &chan, &msg, &op, &sql, &acc, &reg, &undo);
     
    /*La fonction loadconf*/
    int loadconf (char** server, unsigned int *port, char** host, char **user, char** nick, char **chan, char **msg, char** op, int *sql, int *acc, int *reg, int *undo){
     
    	const char *path = "file.conf";
    	FILE* fconf = NULL;
    	char line[1024];
    	char val[1024];
     
    		fconf = fopen (path, "r");
    			if (fconf == NULL){
    				fprintf (stderr, "file.cong not found!\n");
    				return;
    			}
     
    			while (feof(fconf) == 0){
    				fgets (line, sizeof (line), fconf);
    				//printf (">%s\n", line);
    					if (sscanf (line, "# %s", val))	;/*we ignore the comments*/	
    					else
    						if (sscanf (line, "server=%s", val)){
    							*server = malloc (strlen(val) * sizeof (char));
    							strcpy (*server, val);
    						}
    						else
    							if (sscanf (line, "port=%u", &port));
    							else
    								if (sscanf (line, "host=s", val)){
    									*host = malloc (strlen(val) * sizeof (char));
    									strcpy (*host, val);
    								}
    								else
    									if (sscanf (line, "user=%s", val)){
    										*user = malloc (strlen(val) * sizeof (char));
    										strcpy (*user, val);
    									}
    									else
    										if (sscanf (line, "nick=%s", val)){
    											*nick = malloc (strlen(val) * sizeof (char));
    											strcpy (*nick, val);
    										}
    										else
    											if (sscanf (line, "chan=%s", val)){
    												*chan = malloc (strlen(val) * sizeof (char));
    												strcpy (*chan, val);
    											}
    											else
    												if (sscanf (line, "msg=%[^\0]s", val)){
    													*msg = malloc (strlen(val) * sizeof (char));
    													strcpy (*msg, val);
    												}
    												else
    													if (sscanf (line, "op=%s", val)){
    														*op = malloc (strlen(val) * sizeof (char));
    														strcpy (*op, val);
    													}
    													else
    														if (sscanf (line, "chan=%s", val)){
    															*chan = malloc (strlen(val) * sizeof (char));
    															strcpy (*chan, val);
    														}
    														else
    															if (sscanf (line, "sql=%d", &sql)) ;
    															else
    																if (sscanf (line, "acc=%d", &acc));
    																else
    																	if (sscanf (line, "reg=%d", &reg)) ;
    																	else
    																		if (sscanf (line, "undo=%d", &undo)) ;
     
    			}
     
     
    		fclose (fconf);
     
    	return 1;
    }
    Donc çà marche, çà charge tout correctement, SAUF pour les entités entières :s (ps: int acc quant à lui il est bien chargé :/)
    De plus là syntaxe du fichier de conf est identique, j'ai absolument vérifié donc çà ne peut provenir de là.
    Une idée?
    Merci
    Compil your life guy!
    The Aures Project

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Goundy
    J'ai un soucis incompréhensible avec sscanf :/
    C'est pour cela qu'on utilise fgets...

    Une idée?
    Utilise fgets...

    Jc

    [EDIT]Milles excuses, j'ai regardé le code et j'ai vu scanf à la place de sscanf... Va savoir pourquoi... Je deviens dyslexique...[/EDIT]

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Donne un exemple complet minimal... mais si tu es capable d'utiliser scanf, le faire devrait te montrer ton problème.

  4. #4
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Ca ne proviendrait pas des paramètres ?

    "sql" est un int*.
    Or dans ton sscanf, tu passes "&sql", donc un int**.
    Non ?

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Au fait, si j'ai bien compté, il y a vingt niveaux d'indentation... j'ai comme l'impression que le code mérite une réorganisation.

  6. #6
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Ouay, surtout que chaque cas se ressemble, ça pourrait faire l'objet d'une boucle

  7. #7
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Les gars si vous avez pris le temps de regarder mon code vous auriez remarqué que j'utilise bien fgets.
    sscanf me sert à récupérer les valeurs c'est tout.
    Le problème ne peut provenir de mes paramètres, sql est un int* et à l'appelle je fais: &sql car je le modifie.
    Boucler ne m'intérresse pas, réorganiser la source m'intérresse moins POUR LE MOMENT, ce que je veux c'est juste comprendre ce qui bug.
    Merci
    Compil your life guy!
    The Aures Project

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Je sais pas si ça a un rapport, mais il manque un pourcent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (sscanf (line, "host=s", val)){

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Goundy
    Le problème ne peut provenir de mes paramètres, sql est un int* et à l'appelle je fais: &sql car je le modifie.
    Tu veux lire un pointeur?...

  10. #10
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Pour moi, ça c'est bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int *sql;
    ...sscanf (line, "sql=%d", &sql);
    Il me semble que sscanf attend un int *, pas un int **.

  11. #11
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Citation Envoyé par zooro
    Il me semble que sscanf attend un int *, pas un int **.
    J'aurais du m'en rendre compte quand même, la honte ^^
    Merci
    Et merci à tout ceux qui ont répondu

    ps: fait chier ce genre d'erreurs :/
    Compil your life guy!
    The Aures Project

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par fearyourself
    C'est pour cela qu'on utilise fgets...
    Aucun rapport avec fgets(). Il est d'usage d'utiliser fgets() + sscanf().

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Goundy
    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
     
    /*main: déclarations et appelle*/
     char *ip;
     char *nick;
     char *chan;
     char *msg;
     char *host;
     char *user;
     char *op;
     int sql, acc, reg, undo;
     unsigned int port;
     
    i = loadconf (&ip, &port,  &host, &user, &nick, &chan, &msg, &op, &sql, &acc, &reg, &undo);
     
    /*La fonction loadconf*/
    int loadconf (char** server, unsigned int *port, char** host, char **user, char** nick, char **chan, char **msg, char** op, int *sql, int *acc, int *reg, int *undo){
    M'étonnerait que les données soient en vrac comme ça...
    Tu devrais apprendre à utiliser les structures...

  14. #14
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Ouaip emmanuel, d'ailleurs c'est ce que je vais faire :]
    MercI
    Compil your life guy!
    The Aures Project

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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