OVH Cloud OVH Cloud

chaine de caractere

11 réponses
Avatar
Gilles
bonjour,

en java on execute

string chaine1 = "valeur :"+valeur;

mais en C++ (appli window) ?

merci
Gilles

10 réponses

1 2
Avatar
Benoit Dejean
Le Fri, 31 Oct 2003 13:51:21 +0100, Gilles a écrit :

bonjour,

en java on execute

string chaine1 = "valeur :"+valeur;

mais en C++ (appli window) ?


valeur c'est quoi comme type ? pas de toString comme en Java, il faut que
le type de ton object est un operateur de conversion (le plus souvent
l'opérateur pour ~ecrire sur un std::ostream (un flux)

un petit tour ici
http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/#flux_entree_sortie
pour comprendre comment écrire sur un flux

Avatar
Gilles
SetWindowText(edithwnd, szFileName); => ça marche

mais ca serai ça que je désire faire snift

SetWindowText(edithwnd, "fichier : " ..... szFileName);

merci encore

----- Original Message -----
From: "Benoit Dejean"
Newsgroups: fr.comp.lang.c++
Sent: Friday, October 31, 2003 1:45 PM
Subject: Re: chaine de caractere



bonjour,

en java on execute

string chaine1 = "valeur :"+valeur;

mais en C++ (appli window) ?


valeur c'est quoi comme type ? pas de toString comme en Java, il faut que
le type de ton object est un operateur de conversion (le plus souvent
l'opérateur pour ~ecrire sur un std::ostream (un flux)

un petit tour ici

http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/#flux_entree_sortie

pour comprendre comment écrire sur un flux



"Benoit Dejean" a écrit dans le message de
news:

bonjour,

en java on execute

string chaine1 = "valeur :"+valeur;

mais en C++ (appli window) ?


valeur c'est quoi comme type ? pas de toString comme en Java, il faut que
le type de ton object est un operateur de conversion (le plus souvent
l'opérateur pour ~ecrire sur un std::ostream (un flux)

un petit tour ici

http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/#flux_entree_sortie

pour comprendre comment écrire sur un flux




Avatar
Michaël Monerau
Gilles wrote:
SetWindowText(edithwnd, szFileName); => ça marche

mais ca serai ça que je désire faire snift

SetWindowText(edithwnd, "fichier : " ..... szFileName);


Déjà, lis ça :
http://www.giromini.org/usenet-fr/repondre.html

Ensuite, ton cas est traité dans la FAQ que t'as posté Benoît :
http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++FAQ

SetWindowText est une fonction Windows (et non standard) qui prend comme
paramètre une chaîne de caractères de type C. Il faudra donc que tu tapes
dans le membre "c_str()", mais encore une fois, tout est dit dans la FAQ.

Je te mets tout de même un petit exemple pour ce que tu veux faire :

#include <string>
#include <sstream>
//...

char* szFileName = ...; // je suppose que tu dois utiliser
// char*, sinon prends std::string
std::ostringstream oss;
oss << "Fichier : " << szFileName;
SetWindowText (edithwnd, oss.str().c_str());

voilà. Mais tu comprendras mieux une fois que tu auras lu la FAQ :)
--
<=- Michaël "Cortex" Monerau -=>

Avatar
Fabien LE LEZ
On Fri, 31 Oct 2003 13:51:21 +0100, "Gilles"
wrote:

string chaine1 = "valeur :"+valeur;

mais en C++


Idem, sauf qu'on écrit généralement std::string.
Si valeur n'est pas un std::string, on écrira généralement quelque
chose comme
std::string chaine1= "valeur : " + std::string (valeur);
ou
std::string chaine1= std::string ("valeur : ") + valeur;

--
;-)

Avatar
Benoit Rousseau
Fabien LE LEZ wrote:
On Fri, 31 Oct 2003 13:51:21 +0100, "Gilles"
wrote:


string chaine1 = "valeur :"+valeur;

mais en C++



Idem, sauf qu'on écrit généralement std::string.
Si valeur n'est pas un std::string, on écrira généralement quelque
chose comme
std::string chaine1= "valeur : " + std::string (valeur);
ou
std::string chaine1= std::string ("valeur : ") + valeur;

Sauf qu'il n'existe pas de std::string( int )...

Le mieux c'est stringstream, mais je n'aime pas trop l'ecriture qui est
un peu lourd...

Pourquoi n'ont ils pas fait un constructeur qui permettrait :
ostringstream os << "valeur : " << valeur ;
?
Il faut a chaque fois le mettre sur deux lignes, même pour un objet très
temporaire...


--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Loïc Joly
Benoit Rousseau wrote:

Si valeur n'est pas un std::string, on écrira généralement quelque
chose comme std::string chaine1= "valeur : " + std::string (valeur);
ou
std::string chaine1= std::string ("valeur : ") + valeur;

Sauf qu'il n'existe pas de std::string( int )...

Le mieux c'est stringstream, mais je n'aime pas trop l'ecriture qui est
un peu lourd...


Il y a un truc dans boost qui encapsule ça :

#include <boost/lexical_cast.hpp>
std::string chaine1= std::string ("valeur : ") +
boost::lexical_cast<std::string>(valeur);


--
Loïc


Avatar
kanze
Benoit Rousseau wrote in message
news:<3fa28b6e$0$1864$...
Fabien LE LEZ wrote:
On Fri, 31 Oct 2003 13:51:21 +0100, "Gilles"
wrote:

string chaine1 = "valeur :"+valeur;

mais en C++


Idem, sauf qu'on écrit généralement std::string. Si valeur n'est pas
un std::string, on écrira généralement quelque chose comme
std::string chaine1= "valeur : " + std::string (valeur);
ou
std::string chaine1= std::string ("valeur : ") + valeur;


Sauf qu'il n'existe pas de std::string( int )...


Est qu'est-ce qu'il devrait faire ? Générer une chaîne de n espaces, ou ?

En Java, tout peut se convertir en chaîne. Avec un format en général pas
très convivable, évidemment. Au point que je me suis jamais servi de
cette facilité, et que j'ai bien regretté les vérifications d'erreur
qu'il y avait en C++ à cet égard.

Le mieux c'est stringstream, mais je n'aime pas trop l'ecriture qui
est un peu lourd...

Pourquoi n'ont ils pas fait un constructeur qui permettrait :
ostringstream os << "valeur : " << valeur ;
?


Et comment accéder à la valeur générée ?

Au fond, c'est assez simple à simuler, si tu en as envie :

class TemporaryFormattedString
{
public:
template< typename T > TemporaryFormattedString&
operator<<( T const& value )
{
myValue << value ;
}

operator char const*() const
{
return myValue.str().c_str() ;
}
private:
std::ostringstream myValue ;
} ;

Sinon, il y a GB_Format, à ma site, qui supporte un formattage à la
printf.

Dans tous les cas, si tu passes un char const* que tu as extrait d'un
std::string, il faut que tu reflechis sur la durée de vie de la chaîne
ainsi créée : est-ce que la fonction que tu appelles en fait une copie,
ou est-ce qu'elle s'attend à ce que le code client s'en occupe ?

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



Avatar
kanze
Loïc Joly wrote in message
news:<bnubun$ott$...
Benoit Rousseau wrote:

Si valeur n'est pas un std::string, on écrira généralement quelque
chose comme std::string chaine1= "valeur : " + std::string (valeur);
ou
std::string chaine1= std::string ("valeur : ") + valeur;


Sauf qu'il n'existe pas de std::string( int )...
Le mieux c'est stringstream, mais je n'aime pas trop l'ecriture qui
est un peu lourd...


Il y a un truc dans boost qui encapsule ça :

#include <boost/lexical_cast.hpp>
std::string chaine1= std::string ("valeur : ") +
boost::lexical_cast<std::string>(valeur);


Ce qui est d'une valeur assez limitée dans ce cas-ci. Qu'est-ce qu'il
fait avec 2.3, par exemple ? Ou 1.0/3.0 ?

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



Avatar
Loïc Joly
wrote:
Loïc Joly wrote in message
news:<bnubun$ott$...

Benoit Rousseau wrote:
[...]



Sauf qu'il n'existe pas de std::string( int )...
Le mieux c'est stringstream, mais je n'aime pas trop l'ecriture qui
est un peu lourd...




Il y a un truc dans boost qui encapsule ça :



#include <boost/lexical_cast.hpp>
std::string chaine1= std::string ("valeur : ") +
boost::lexical_cast<std::string>(valeur);



Ce qui est d'une valeur assez limitée dans ce cas-ci. Qu'est-ce qu'il
fait avec 2.3, par exemple ? Ou 1.0/3.0 ?


La question concernait les int ("il n'existe pas de std::string( int )")
et dans ce cas, lexical_cast marche assez bien.

--
Loïc



Avatar
kanze
Loïc Joly wrote in message
news:<bo6alv$q4l$...
wrote:
Loïc Joly wrote in message
news:<bnubun$ott$...

Benoit Rousseau wrote:
[...]



Sauf qu'il n'existe pas de std::string( int )...
Le mieux c'est stringstream, mais je n'aime pas trop l'ecriture qui
est un peu lourd...


Il y a un truc dans boost qui encapsule ça :

#include <boost/lexical_cast.hpp>
std::string chaine1= std::string ("valeur : ") +
boost::lexical_cast<std::string>(valeur);


Ce qui est d'une valeur assez limitée dans ce cas-ci. Qu'est-ce
qu'il fait avec 2.3, par exemple ? Ou 1.0/3.0 ?


La question concernait les int ("il n'existe pas de std::string( int
)") et dans ce cas, lexical_cast marche assez bien.


Pour quelle définition de « assez bien » ? Et est-ce que l'exemple avec
int est censé être exhaustif ?

En fait, comme son nom indique, lexical_cast est conçu pour faire des
conversions de type, en passant par une chaîne. De ce fait, le format
importe peu, à condition qu'il n'y a pas de perte d'information. Quand
je veux une chaîne, en revanche, le format importe beaucoup, et une
solution qui ne me permet pas de le contrôler n'est pas une solution.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16




1 2