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 :

Strlen valeur retournée ? [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut Strlen valeur retournée ?
    Bonjour,

    J'utilise la fonction strlen afin de récupérer la longueur d'une variable, mais la valeur de retour de strlen est toujours n+1 (??)
    Quelle en est la raison ?

    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
     
    #include <stdio.h>                 
    #include <stdlib.h>                
    #include <errno.h>                 
    #include <string.h>                
    /*------- DEFINE ------------------*/
    #define LRECL_MIB 80               
    /*------ MAIN    ------------------*/
    int main(void)                     
    {                                  
    /*---- VARIABLES ET POINTEURS -----*/
     FILE *fichier;                    
     int LenCpc = 0;                   
     char *RCPC = NULL;                
     char Record[LRECL_MIB] = "";      
     long Taille_Record = 0;           
     fichier = fopen("dd:SYSIN","r");  /* ouverture du fichier en lect*/ 
      if (fichier != NULL)             /* test ouverture du fichier  */  
       {                                                                 
                     /* lecture du fichier jusqu'au dernier reccord  */  
         while(fgets(Record,LRECL_MIB,fichier) != NULL)                  
          {                                                              
           RCPC = strchr(Record,'=');                                    
           if (RCPC != NULL )                        /* enreg valide    */
            {                                                            
             LenCpc = strlen(RCPC);                                      
             printf("Le reccord :  %s\n",Record);                        
             printf("CPC LPAR   :  %s\n",RCPC);                          
             printf("len de CPC :  %d\n",LenCpc);                        
            }                                                            
          }                                                              
       }                                                                 
      return(0);
     }
    Voici ce que j'ai lors de l'éxécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Le reccord :  1.3.6.1.4.1.2.6.42.2.0.1.0.6360144 = '4d41300a4d5a303100'h 
    CPC LPAR   :  = '4d41300a4d5a303100'h                                    
    len de CPC :  24                                                         
    Le reccord :  1.3.6.1.4.1.2.6.42.2.0.1.0.79362290 = '4'h
    CPC LPAR   :  = '4'h                                    
    len de CPC :  7
    J'ai lu sur une doc que strlen ne comptait pas \0 de fin de chaine c'est faux ?

  2. #2
    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 SPACHFR
    J'utilise la fonction strlen afin de récupérer la longueur d'une variable, mais la valeur de retour de strlen est toujours n+1 (??)
    <...>
    J'ai lu sur une doc que strlen ne comptait pas \0 de fin de chaine c'est faux ?
    C'est correct. Le +1 est probablement dû au '\n' de la fin de ligne qui est lu par fgets(). Il faut le retirer proprement...

  3. #3
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Le +1 est probablement dû au '\n' de la fin de ligne qui est lu par fgets(). Il faut le retirer proprement...
    .
    Cela veut dire que j'ai une chaine du type : data\n\0
    Donc strlen retourne data +\n.

    Ma question va peut être paraitre stupide, mais \n c'est un LF (x0A), hors quand je regarde le fichier en hexa j'ai des espaces (x20) je ne vois pas de \n.

    Sinon quelles est la méthode propre pour palier à ce type de problème ?

  4. #4
    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 SPACHFR
    .
    Cela veut dire que j'ai une chaine du type : data\n\0
    Donc strlen retourne data +\n.
    Oui, c'est le cas si c'est un fichier texte avec plusieurs lignes.
    Ma question va peut être paraitre stupide, mais \n c'est un LF (x0A), hors quand je regarde le fichier en hexa j'ai des espaces (x20) je ne vois pas de \n.
    Bah, je demande à voir. Le séparateur n'est pas forcément '\n' dans le fichier. C'est '\n' dans le code source C , et c'est traduit comme il faut selon le système quand on ouvre en mode texte.

    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Sinon quelles est la méthode propre pour palier à ce type de problème ?
    search'n kill avec strchr().

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  5. #5
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Merci pour ces infos est liens très instructifs.
    Reste plus qu'a comprendre les exemples.......(je commence tout de suite !!!!)

    MERCI !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/10/2005, 20h12
  2. [CR11] Formule, If statement et valeur retournée
    Par KrusK dans le forum Formules
    Réponses: 3
    Dernier message: 07/09/2005, 12h12
  3. valeur retournée par un .js
    Par astrofiles dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/08/2005, 10h20
  4. valeur retournée d'une fonction
    Par jokos2000 dans le forum Oracle
    Réponses: 8
    Dernier message: 29/06/2005, 12h21
  5. select avec un nombre limité de valeurs retournées
    Par felix79 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/12/2004, 15h16

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