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 :

conversion d'une string en char


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut conversion d'une string en char
    Bonjour,
    j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(str,(char*)dest.Area);
    ou dest.Area est un type de string plus large que le type char (codé sur plus d'octets)
    dest.Area est une string obtenu par un OCR (reconnaissance graphique de texte), je ne controle donc pas ce qu'il peut contenir.
    Ce code fonctionne mais provoque parfois des fermetures de la console (probablement quand un caractère non couvert par le type char est rencontré).
    Existe t-il une fonction qui permet de vérifier si la chaine que l'on veut copié (dest.Area) contient des characteres non contenus dans char (codé sur plus d'octet) ?
    ou bien une fonction qui convertit en char en supprimant les caractères non reconnus ?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    La bonne question, c'est : "Quel est le type de "dest.Area" ?
    Une fois que le type est connu, tu peux le copier dans des objets de même type.

    Si "dest.Area" est du type wchar_t (wide char) ce que tu semble dire, tu ne pourras le copier que dans une chaine de type wchar_t

    Donc d'abord, quel est le type de "dest.Area" ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    C'est justement sur ce point que je suis un peu perdu...
    Le compilateur m'indique que dest.Area est de type (void*). Et quand j'essai d'accéder a un caractère précis de dest.Area (ex: dest.Area[5]), le compilateur me signale une erreur du genre : non arythmetic use of a void pointer

    Du coup, ce satané dest.Area est pour moi une sorte de boite noire qui, par chance, contient bien ce que je cherche à capturer mais j'ai aucune idée comment le manipuler.

    Question annexe : en admettant que je ne respecte pas le type de base, existe t'il un moyen sécurisé de convertir qqchose en char ((char*)variableString) qui occulte les caractères non compris dans le type char ?

    Merci

  4. #4
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Si tu ne connais pas le type de ta variable (et donc d'une zone mémoire), comment veux-tu en interpréter les données qu'elle contient?
    Pour lire un void*, tu dois forcément faire un cast de ta variable dans le type qui lui va bien. Si tu ne sais pas en quoi la caster, t'es mal barré pour interpréter les 0 et les 1 qu'elle contient...

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Si dest.Area est du type void *, tu n'a pas le droit de faire dest.Area[5].

    Si tu ne sais pas ce que représente dest.Area, il me semble dangereux de vouloir le transformer en chaine de caractères à tout prix parce que tu as vu que dedans, il y avait ce que tu voulais.

    Peut être que les 20 premiers octets sont effectivement ta chaine mais que après, c'est un bitmap ou que sais-je encore.

    Il importe donc de savoir le type de cette variable "dest" qui t'es retourné. Il s'agit peut être d'une structure et dedans, tu trouveras peut être la longueur de la chaine qui t'intéresse.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut
    As-tu essayé d'afficher la taille de ton dest.Area, avec sizeof?

    Tu peux p-e essayé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        float  fTab[1024] = {0.0};
        fTab = &dest.Area;
    et afficher chaque caractère de fTab pour tenter de trouver le <type> de dest.Area.
    Une fois que tu as le type tu peux faire une copie tel que
    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
     
        <type> typeTab[1024] = {?};
        char     str[1024] = {0};
        int       i, j;
     
        j=0;
        for(i=0; i<1024; i++)
        {
            if(typeTab[i]==0)
            {
                str[j] = 0; // Sécurité 
                break;
            }
            if(typeTab[i]<127)
            {
                str[j++] = typeTab[i];
            }
        }

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses,

    quand j'essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      float fTab[1024] = {0.0};
      fTab = &dest.Area;
    le compilateur me signale :
    cannot convert `double' to `void**' in initialization

    Je sais vriament pas comment manipuler ce type void...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Il ya qqchose que je ne comprend pas. Comment cette variable dest.Area peut etre elle indiquée de type void** et a la fois posséder un type inconnu et contenir des caractères ?

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    As-tu lu la doc de ton OCR ? D'où le tiens-tu ? Sans plus d'infos on ne peut pas t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(str,(char*)dest.Area);
    Tu dis que ce code fonctionne, dans ce cas c'est bel et bien un char* qui se cache derrière le void*. Si la console plante, c'est peut-être que tu essaies simplement de mettre une chaîne trop grande dans str. Utilise std::string qui n'a pas de problème de dépassement de capacité et viens nous dire si ça marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string str( reinterpret_cast<char*>(dest.Area) );

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Apparement le type de dest.Area est réellement void, rien d'autre n'est spécifié dans la doc.
    Voici le code de la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class TextractDest {
     public:
      TextractDest(const char *destFileName);
      TextractDest();
     
      const char *FileName; // NULL if area specifeid, else dest file name
      void *Area; // NULL if file name specified, else memory area
      int AreaSize;
    };
    TextractExport TextractSuccess TextractDestFree(TextractDest&);
    ou dest est de type TextractDest

    Je vais essayer de le caster dans un type string comme tu l'as suggéré, mais ca ne m'arrange pas car toute l'utilisation de cette variable str est basée sur le type char.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    j'ai essayé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string str( reinterpret_cast<char*>(dest.Area) );
    a la place de celui la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(str,(CHAR*)dest.Area);
    La compilation marche mais l'appli plante toujours...

  12. #12
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    La fonction strcat continuera de copier et encore et encore jusqu'à la fin des temps sauf si elle trouve un caractère NULL '\0' dans la source.

    Le fait que l'on ait rempli la chaine destination ne la dérange absolument pas elle continuera allégrement faisant sauter au passage les variables, le code du programme voire même s'attaquera aux applications voisines si la mémoire n'est pas protégée

    Il faut utiliser strncat à la place avec en paramètre la taille maximale de la chaîne de destination(-1 pour le '\0' final)

  13. #13
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par vulkanosaure Voir le message
    Apparement le type de dest.Area est réellement void
    Ce que tu dis n'a pas de sens. On ne peut pas instancier de variable void. Il y a forcément un type derière ce void * et je suis à peu près certain que c'est du char*.

    Par contre, tu n'est peut-être pas autorisé à utiliser cette méthode si elle est si peu documentée..

    J'imagine que tu fais bien un test pour les cas ou Area est NULL?

    Ensuite que fais-tu de ta string ou de char * str ?

    La question la plus importante : Avec un débuggeur, t'es-tu assuré que c'était bien std::string str( reinterpret_cast<char*>(dest.Area) ); qui faisait planter l'appli et pas une des instructions plus loin ? Toujours avec ton débuggeur en mode pas à pas, tu dois pouvoir voir ce que contient ta string une fois initialisée, regarde si c'est cohérent.

    Perso, je pense que ça vient de plus loin ton plantage, ou alors ça vient de ta classe TextractDest, soit d'une mauvaise utilisation (pas de vérification pour null), soit elle est buggé simplement.

Discussions similaires

  1. Conversion de type string en char ?
    Par CoachMac dans le forum C
    Réponses: 18
    Dernier message: 08/08/2006, 10h20
  2. conversion d'un string en char *
    Par ferry.jules dans le forum C++Builder
    Réponses: 15
    Dernier message: 12/05/2006, 22h12
  3. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54
  4. caster une string en char*
    Par luta dans le forum C++
    Réponses: 5
    Dernier message: 20/01/2006, 02h36
  5. Conversion d'une chaine de char en numerique
    Par simone.51 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/03/2004, 16h47

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