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 strlwr


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Par défaut Problème avec strlwr
    Bonjour,

    J'ai le message :
    makes pointer from integer without a cast
    à la ligne
    while((p = strstr(strlwr(pelt),strlwr(elt))) && p != NULL)
    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
     
    FILE *fichier;
    char *elt = NULL;
    char *pelt = NULL;
     
    elt = argv[2];
     
    if ((fichier = fopen(chaine,"r")) == NULL) 
       exit(1);
     
      while (fgets(ligne,sizeof ligne,fichier) != NULL)
      {
       lgligne = strlen(ligne);
       pelt = ligne;
       /* Recherche de la chaine dans la ligne lue */
       while((p = strstr(strlwr(pelt),strlwr(elt))) && p != NULL)
       {
        nb++;
        p+=lgelt;
        pelt = p;
       }
      }
    Pourtant pelt et elt sont tous bien des pointers.

    Avez-vous une idée ?

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Ne connaissant pas la fonction strlwr() (je n'ai pas trouvé de man, même sur ma distrib linux), je dirais à première vu que strlwr() retourne un int alors que strstr() attends un char *

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par crocodilex
    Ne connaissant pas la fonction strlwr(),
    Il s'agit surement d'une fonction maison ? Avoir son prototype pourrais nous aider ainsi que la déclaration de p

  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 licorne
    /* Recherche de la chaine dans la ligne lue */
    while((p = strstr(strlwr(pelt),strlwr(elt))) && p != NULL)
    Comportement indéfini
    • fonction strlwr() non standard
    • nom réservé
    http://emmanuel-delahaye.developpez....htm#id_reserve

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Par défaut
    La déclaration de p : Lors de la compilation du prog j'ai obtenu les warnings suivants sur la ligne "while((p = strstr(strlwr(pelt),strlwr(elt))) && p != NULL)" :
    implicit declaration of function 'strlwr'
    passing arg 1 of 'strstr' makes pointer from integer without a cast
    passing arg 2 of 'strstr' makes pointer from integer without a cast
    D'autre part le compilateur est mingw et dans la string.h on trouve :
    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
    #ifndef __STRICT_ANSI__
    /*
     * Extra non-ANSI functions provided by the CRTDLL library
     */
    ...
    _CRTIMP char* __cdecl _strlwr (char*);
    ...
    #ifndef _NO_OLDNAMES
    /*
     * Non-underscored versions of non-ANSI functions. They live in liboldnames.a
     * and provide a little extra portability. Also a few extra UNIX-isms like
     * strcasecmp.
     */
    ...
    _CRTIMP char* __cdecl strlwr (char*);
    ...
    J'ai quand-même lancé le prog puisqu'il s'agissait de warnings et ça marche. Cependant je me méfie des warnings qui indiquent un pb de compatibilité de format.
    Ai-je raison de me méfier ?

    Pouvez-vous m'indiquer également la signification de "implicit declaration of function 'strlwr'" ?

    Merci pour votre aide précieuse.

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    As-tu inclus string.h dans ton source ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Par défaut
    Dans la string.h j'ai défini la fonction strlwr dans la section "/*
    * Prototypes of the ANSI Standard C library string functions.
    */
    " :
    _CRTIMP char* __cdecl strlwr (char*);
    Il reconnait (sans warning) et exécute correctement la fonction strlwr qui met en minuscule une chaine de caractères.

    Pouvez-vous m'expliquer ou se trouve le code des fonctions déclarées dans la libraire "string.h" ?

  8. #8
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Le warning sur les arguments de strstr() signifient que le compilateur n'a pas le prototype de strlwr() et suppose qu'elle retourne un int.
    Pourquoi n'a t-il pas le prototype de strlwr()?
    - parce que tu n'inclus pas <string.h>
    - parce que tu demandes une compilation en C ANSI strict (-ansi), ce qui desactives les extensions.

  9. #9
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par licorne
    Dans la string.h j'ai défini la fonction strlwr dans la section "/*
    * Prototypes of the ANSI Standard C library string functions.
    */
    " :


    Il reconnait (sans warning) et exécute correctement la fonction strlwr qui met en minuscule une chaine de caractères.

    Pouvez-vous m'expliquer ou se trouve le code des fonctions déclarées dans la libraire "string.h" ?
    Qu'est-ce que tu es entrain de faire comme bricolage ?
    "string.h" n'est pas une librairie, mais un fichier d'entête.
    Expliques-nous ce que tu veux faire.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Par défaut
    Citation Envoyé par crocodilex
    Qu'est-ce que tu es entrain de faire comme bricolage ?
    "string.h" n'est pas une librairie, mais un fichier d'entête.
    Expliques-nous ce que tu veux faire.
    J'ai donc déclaré l'entête strlwr dans le fichier d'entête string.h au même endroit que les autres entêtes "/*
    * Prototypes of the ANSI Standard C library string functions.
    */
    " avec la ligne suivante :
    /*
    * Prototypes of the ANSI Standard C library string functions.
    */
    _CRTIMP void* __cdecl memchr (const void*, int, size_t) __MINGW_ATTRIB_PURE;
    _CRTIMP int __cdecl memcmp (const void*, const void*, size_t) __MINGW_ATTRIB_PURE;
    _CRTIMP void* __cdecl memcpy (void*, const void*, size_t);
    _CRTIMP void* __cdecl memmove (void*, const void*, size_t);
    _CRTIMP void* __cdecl memset (void*, int, size_t);
    _CRTIMP char* __cdecl strcat (char*, const char*);
    _CRTIMP char* __cdecl strchr (const char*, int) __MINGW_ATTRIB_PURE;
    _CRTIMP int __cdecl strcmp (const char*, const char*) __MINGW_ATTRIB_PURE;
    _CRTIMP int __cdecl strcoll (const char*, const char*); /* Compare using locale */
    _CRTIMP char* __cdecl strcpy (char*, const char*);
    _CRTIMP size_t __cdecl strcspn (const char*, const char*) __MINGW_ATTRIB_PURE;
    _CRTIMP char* __cdecl strerror (int); /* NOTE: NOT an old name wrapper. */
    _CRTIMP size_t __cdecl strlen (const char*) __MINGW_ATTRIB_PURE;
    _CRTIMP char* __cdecl strncat (char*, const char*, size_t);
    _CRTIMP int __cdecl strncmp (const char*, const char*, size_t) __MINGW_ATTRIB_PURE;
    _CRTIMP char* __cdecl strncpy (char*, const char*, size_t);
    _CRTIMP char* __cdecl strpbrk (const char*, const char*) __MINGW_ATTRIB_PURE;
    _CRTIMP char* __cdecl strrchr (const char*, int) __MINGW_ATTRIB_PURE;
    _CRTIMP size_t __cdecl strspn (const char*, const char*) __MINGW_ATTRIB_PURE;
    _CRTIMP char* __cdecl strstr (const char*, const char*) __MINGW_ATTRIB_PURE;
    _CRTIMP char* __cdecl strtok (char*, const char*);
    _CRTIMP size_t __cdecl strxfrm (char*, const char*, size_t);
    _CRTIMP char* __cdecl strlwr (char*);
    Le résultat de la compilation montrait qu'il reconnaissait la fonction strlwr mais qu'apparament elle était mal déclarée dans le fichier string.h.
    C'était juste un essai pour essayer de trouver une solution. Qu'en pensez-vous ?

  11. #11
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    J'ai donc déclaré l'entête strlwr dans le fichier d'entête string.h au même endroit que les autres entêtes
    Houlala, il ne faudrait surtout pas toucher à ces fichiers !

    Pourquoi ne pas utiliser un équivalent conforme au standard ?

    En utilisant strlen()(<string.h>) et la fonction tolower() (<ctype.h>)dans une boucle, le problème serait reglé et conforme au standard.

    La fonction tolower() ne travaille que sur un seul caractère, c'est pourquoi il faudra boucler sur chaque caractère de la chaîne.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Par défaut
    Citation Envoyé par Neitsa
    Bonjour,



    Houlala, il ne faudrait surtout pas toucher à ces fichiers !

    Pourquoi ne pas utiliser un équivalent conforme au standard ?

    En utilisant strlen()(<string.h>) et la fonction tolower() (<ctype.h>)dans une boucle, le problème serait reglé et conforme au standard.

    La fonction tolower() ne travaille que sur un seul caractère, c'est pourquoi il faudra boucler sur chaque caractère de la chaîne.

    Ok, je convertis caractère par caractère.

    Merci à tous.

  13. #13
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par licorne
    Ok, je convertis caractère par caractère.
    Un peu dans ce genre là : Modifier la case d'une chaîne de caractère

+ 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