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 :

string en char*


Sujet :

C++

  1. #1
    Invit�
    Invit�(e)
    Par d�faut string en char*
    Bonjour,
    J'ai une fonction qui prend en param�tre un LPVOID soit un char* ou voir unsigned char* pour �crire dedans (me renvoy� le resultat)

    J'aimerais bien utilis� le string ici pour pas a avoir a utilis� malloc free etc donc comment je peut faire �a depuis un string ? comment la fonction peut m'�crire dans mon std::string ?

    si c'est trop compliqu� je vais utilis� un char* et puis c'est tout...

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Salut,

    on a beau attendre un char*, utiliser string n'est pas la bonne chose � faire.
    Ce qu'il faut utiliser c'est vector ou array.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    une std::string n'est pas adapt�e pour servir de buffer de r�ception. Des optimisations internes font que m�me si la destination finale est une std::string, il est plus optimum de passer par un interm�diaire.
    Le buffer LPVOID doit avoir une taille pr�conis�e maximum, dans ce cas un simple tableau doit �tre utilis�, il faut �viter les allocations m�moire.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    constexpr size_t LgMax = 100;
    std::array<char,LgMax> buffer;
    fonction( buffer , buffer.size() );  // requête fonction C en indiquant la taille max
    // après contrôle que tout est okay
    std::string str_result{ buffer.data() };
    // ou si la fonction a retourné la longueur lg, on peut aussi faire
    str.assign( buffer.begin() , buffer.begin()+lg );

  4. #4
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,
    Citation Envoy� par dalfab Voir le message
    il faut �viter les allocations m�moire.
    Je suis tout � fait d'accord avec le principe, mais encore faut il voir la taille du tampon...

    Si cette taille est de "quelques dizaines" de bytes, le fait d'�viter l'allocation de m�moire ne devrait pas poser de probl�mes (� moins, bien sur, d'en arriver � multiplier les tampons, dans un appel r�cursif qui nous aurait �chapp�, par exemple).

    Mais, d�s que la taille du tampon devient "trop importante" (ne serait-ce que 65 535 -- voire moins (16 mille et une fafiote )-- qui correspond, en gros, � la valeur maximale repr�sentable � l'aide d'un short), je crois quand m�me que l'utilisation d'un std::vector se justifie pleinement pour �viter les stack overflow...
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  5. #5
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    Cette discussion soul�ve toute la difficult� � m�langer du C++ avec C

    Mais il y a des solutions et les gourous qui pensent le C++ ont enfin trouv� la parade
    Je prends donc les autres intervenants � contre-pied pour affirmer que, oui, on peut utiliser std::string pour appeler une fonction qui demande un char *.
    C'est ainsi que depuis C++17 la methode data() est (enfin !) d�clin�e en une deuxi�me version non const qui renvoit un char *.

    Perso j'utilise depuis tr�s longtemps du code dans ce genre avec succ�s:
    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
    std::wstring StrDateTime(bool localtime)
    {
    	SYSTEMTIME st;
    	if (!localtime)
    		GetSystemTime(&st);
    	std::wstring sdt(31, '\0');
    	int len = GetDateFormatEx(
    		LOCALE_NAME_INVARIANT, 0ul, localtime ? NULL : &st,
    		L"yyyy'-'MM'-'dd ", &sdt[0], (int)sdt.size(), NULL) - 1;
    	len += GetTimeFormatEx(
    		LOCALE_NAME_INVARIANT, 0ul, localtime ? NULL : &st,
    		L"HH':'mm':'ss", &sdt[len], (int)sdt.size() - len) - 1;
    	sdt.resize(len);
    	return sdt;
    }
    Il suffit d'�tre prudent et bien comprendre ce que fait la fonction qui demande un char *

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Mais est-ce que la plate-forme sur laquelle imprimante compile supporte C++17, l� est la question.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre du Club
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Janvier 2018
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 25
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Par d�faut
    On peut pas utiliser la propriet� de c_str() de l'objet string ?

  8. #8
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Je r�sume.

    Deux cas de figure => deux solutions.
    1- Si ta fonction lit l'information derri�re le pointeur sans la modifier -> std::string::c_str().

    2- Si ta fonction re�oit une chaine que tu dois stocker quelque part, alors d�finis un vecteur (si la taille est dynamique) (ou un std::array sinon), dimensionne le comme il se doit et lis dedans � partir de data(v), ou &v[0], ce qui est pareil ici. Tu pourras ensuite convertir ton tableau en std::string si tu le souhaites/en as besoin -- voire en std::string_view (C++17) ce qui sera plus efficace selon ce que tu fais de la chaine ensuite.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  9. #9
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par camboui Voir le message
    C'est ainsi que depuis C++17 la methode data() est (enfin !) d�clin�e en une deuxi�me version non const qui renvoit un char *.
    Oui, enfin, l'utilisation de data() au lieu de c_str() ne va r�soudre qu'une partie du probl�me, et en ignorer royalement deux autres:
    D'un cot�, data() permet, effectivement, de fournir un char * dont le contenu peut �tre modifi� par une fonction C, mais
    1. la fonction qui re�oit ce char * doit veiller � ne pas d�passer la taille du tableau qu'il repr�sente et
    2. l'id�e de ce char * reste de repr�senter ... une chaine de caract�res. Or, un tempon peut envisager d'utiliser -- par exemple -- quatre byte pour repr�senter un (unsigned) int, et la valeur de ce (unsigned) int (*) pourrait tout � fait contenir un ou plusieurs byte(s) nul(s) et / ou correspondant � un / des caract�re(s) particulier(s) (typiquement : n'importe quel caract�re dont la valeur est comprise entre 0 et 31 inclus)

    (*) le tout, sans m�me consid�rer le probl�me du boutisme utilis� pour la repr�sentation de cette valeur.

    Nous sommes bien d'accord sur le fait que le premier point soulev� ici est commun � std::string et � std::vector</*unsigned*/ char>.

    Mais le gros probl�me viendra du deuxi�me point, sp�cifique � l'utilisation de std::string, qui consid�rera forc�ment chaque byte comme un caract�re, et qui l'interpr�tera en cons�quence.

    C'est sans doute la raison qui a fait que, nous disposons , depuis C++17, de std::byte qui nous permet justement d'�viter la confusion entre la valeur num�rique d'un caract�re et son interpr�tation ASCII.

    Et c'est la raison pour laquelle, quitte � avoir un tampon "de taille fixe" (� l'ex�cution), il est largement pr�f�rable d'opter pour std::vector<std::byte> si la taille du tampon est d�finie � l'ex�cution ou pour std::array<std::byte, taille_predefinie> si la taille peut �tre d�finie � la compilation et qu'elle ne pose pas de probl�me en terme d'utilisation de la pile.
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [DEBUTANT] String et char, bug
    Par FinalSpirit dans le forum D�buter
    R�ponses: 15
    Dernier message: 10/01/2006, 18h42
  2. Borland + sqlite (aducom) + string > 256 char = pas conte
    Par spyroux dans le forum C++Builder
    R�ponses: 1
    Dernier message: 16/12/2005, 22h48
  3. Evaluation d'une variable string ou char* en C++
    Par Coelacanthe dans le forum SL & STL
    R�ponses: 2
    Dernier message: 08/11/2005, 09h27
  4. Convertir String en Char: comment?
    Par nmathon dans le forum Langage
    R�ponses: 2
    Dernier message: 22/08/2005, 20h58
  5. [Debutant(e)]limitation du String 65536 char
    Par srane dans le forum API standards et tierces
    R�ponses: 8
    Dernier message: 28/05/2004, 23h42

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