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 strncmp


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut problème avec strncmp
    Bonjour,

    Je travaille sur Ubuntu 10.04 LTS x86_64.

    J'essaie de parser un message texte que je lis depuis un fichier et que je charge en mémoire.
    Quand j'execute le code j'ai un seg fault (sur les strncmp se trouvant dans la boucle while je suppose car quand j'enlève les tous les printf, le seg fault persiste et quand j'enlève tous les strncmp dans le while il n'y a plus de seg fault. Le plus bizarre c'est que ca donne bien le résultat auquel j'attends mais avec un seg fault. Voici le résultat de l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    From is found
    Call-id is found
    Contact is found
    m is found
    Erreur de segmentation

    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define LIM 1500
    #define METHODE "INVITE"
     
    int main(){
    	FILE* fic;
    	fic = fopen(METHODE, "r"); 
    	char data[LIM];
     
    	if(fic == NULL){
          printf("Impossible d'ouvrir le fichier\n");
          exit(1);
    	}
     
    	fread(data, LIM, 1, fic);
    #ifdef DEBUG	
    	printf("%s\n", data);		
    #endif	
     
    	char delims[2] = {0x0D, 0x0A};//CRLF
    	char *line = NULL;
     
    	if(!strncmp(data, "INVITE", 6)){ 
    		line = strtok( data, delims );
     
    		while( line != NULL ) {
     
    			line = strtok( NULL, delims );
     
    			if(!strncmp(line, "From", 4)){				
    				printf( "From is found\n");				
    			}
     
     
    			if(!strncmp(line, "Call-ID", 7)){						
    				printf("Call-id is found\n");
    			}
     
    			if(!strncmp(line, "Contact", 7)){
    				printf( "Contact is found\n");				
    			}
     
    			if(!strncmp(line, "m=", 2)){
    				printf( "m is found\n" );
     
    			}  		
    		}
     
    		if(fclose(fic) == EOF) {
    		  printf("Probleme de fermeture du fichier \n");
    		  exit(1);
    		}
    	}
     
    	return 0;
    }
    Est ce que quelqu'un aurait une idée d'ou vient ce segfault ?

    un gdb me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (gdb) run
    Starting program: /home/ikuzar/test/sip_parsing/tmp 
    From is found
    Call-id is found
    Contact is found
    m is found
     
    Program received signal SIGSEGV, Segmentation fault.
    0x00007ffff7b8836c in ?? () from /lib/libc.so.6
    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je pense que ton Segmentation fault est dû à ton pointeur line NULL car tu ne le vérifies pas après la ligne 31 line = strtok( NULL, delims );.
    Plutôt que de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    line = strtok( data, delims );
     
    while( line != NULL ) {
     
        line = strtok( NULL, delims );
     
        /* tes tests if(!strncmp(...)) { ... } */			
    }
    faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    line = strtok( data, delims );
     
    while( line != NULL ) {
     
        /* tes tests if(!strncmp(...)) { ... } */			
     
        line = strtok( NULL, delims );
    }
    De plus (voulu ou pas), tu sautais ta première occurrence car appliquais deux strtok() à la suite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    line = strtok( data, delims );
     
    while( line != NULL ) {
     
        line = strtok( NULL, delims );

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut
    Effectivement, c'est à cause du fait que je ne vérifie pas line à la ligne 31 !
    Par contre, je n'ai pas compris quand tu dis que je sautais ma première occurence !
    Mon délimiteur c'est un CRLF et le code m'affiche bien les 2 premières lignes de mon fichier !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Il te les affiche bien oui avec ta ligne printf("%s\n", data); mais je parlais de la suite de ton traitement dans ta boucle while qui ne commençait qu'à la seconde ligne.
    Mais voyant if(!strncmp(data, "INVITE", 6)){ je présume que c'est fait exprès.

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut
    Oui, c'est fait exprès !
    Merci pour tes explications !!

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

Discussions similaires

  1. [strncmp] Problème avec détection de caractère '
    Par Henwiro dans le forum MATLAB
    Réponses: 2
    Dernier message: 29/03/2012, 10h33
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  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