IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

FAQ C++Consultez toutes les FAQ

Nombre d'auteurs : 34, nombre de questions : 368, derni�re mise � jour : 14 novembre 2021  Ajouter une question

 

Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur les forums de http://www.developpez.com et de l'exp�rience personnelle des auteurs.

Je tiens � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur ou si vous souhaitez devenir r�dacteur, lisez ceci.

Sur ce, nous vous souhaitons une bonne lecture.

SommaireLes cha�nes de caract�res : std::stringConversions (8)
pr�c�dent sommaire suivant
 

En utilisant tout simplement le constructeur ou l'op�rateur d'affectation de la classe std::string :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
#include <string> 
  
// construction 
std::string str1 = "coucou"; 
std::string str2( "coucou" ); 
// affectation 
std::string str3; 
str3 = "coucou"; 
str3.assign( "coucou" );

Mis � jour le 22 novembre 2004 Aurelien.Regat-Barrel JEG LFE

M�me en C++ on est parfois oblig� d'utiliser des char *. Pour obtenir une cha�ne de caract�res C non modifiable (const char *), il suffit d'appeler la fonction c_str() de string.

Code c++ : S�lectionner tout
1
2
3
string file_name = "fichier.txt"; 
// ouverture du fichier 
ifstream file( file_name.c_str() ); // Avant C++11, le constructeur de std::ifstream n'accepte pas de string
La cha�ne renvoy�e est qualifi�e comme non modifiable via le mot-cl� const. Il ne faut pas chercher � la modifier. � ce sujet, lire les questions Quelle est la diff�rence entre char*, const char* et char const * ? et Quelles pr�cautions faut-il prendre avec string::c_str() et string::data() ?.
Pour obtenir une cha�ne de type C modifiable, il faut cr�er une copie de la string.

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string> 
#include <cstring> 
#include <iostream> 
  
int main() 
{ 
    std::string str = "une chaîne de caractères"; 
    // créer le buffer pour copier la chaîne 
    size_t size = str.size() + 1; // + 1 pour le caractère '\0' de fin 
    char * buffer = new char[ size ]; 
    // copier la chaîne 
    strncpy( buffer, str.c_str(), size ); 
    // utiliser le buffer 
    std::cout << buffer << '\n'; // "une chaîne de caractères"  
    // libérer la mémoire 
    delete [] buffer; 
}

Mis � jour le 19 octobre 2004 Aurelien.Regat-Barrel LFE

L'utilisation d'un objet ostringstream permet de convertir un entier en une string :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
#include <sstream> 
  
int main() 
{     
    // cr�er un flux de sortie 
    std::ostringstream oss; 
    // �crire un nombre dans le flux 
    oss << 10; 
    // r�cup�rer une cha�ne de caract�res 
    std::string result = oss.str(); 
}
Pour une solution g�n�rique � ce probl�me, consultez Comment convertir n'importe quel type d'objets en string ?.
Pour �viter les erreurs, lire aussi [Pi�ge] Comment initialiser/affecter un nombre � une string ?.

Mis � jour le 19 octobre 2004 Aurelien.Regat-Barrel

En utilisant istringstream :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
#include <sstream> 
  
int main() 
{ 
    // cr�er un flux � partir de la cha�ne � convertir 
    std::istringstream iss( "10" ); 
    // convertir en un int 
    int nombre; 
    iss >> nombre; // nombre vaut 10 
}
Vous pouvez consulter Comment convertir une string en un objet de n'importe quel type ? pour une utilisation plus g�n�rique de cette solution.

Mis � jour le 19 octobre 2004 Aurelien.Regat-Barrel

L'utilisation de ostringstream permet de convertir en une string n'importe quel objet pour lequel l'op�rateur ostream::operator <<() a �t� d�fini. Il est donc possible de cr�er une fonction g�n�rique de conversion de n'importe quel objet en une string gr�ce � l'utilisation des templates :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <sstream>   
  
template<typename T> 
std::string to_string( const T & Value ) 
{ 
    // utiliser un flux de sortie pour cr�er la cha�ne 
    std::ostringstream oss; 
    // �crire la valeur dans le flux 
    oss << Value; 
    // renvoyer une string 
    return oss.str(); 
} 
  
int main() 
{     
    std::string num = to_string( 10 ); 
}

Mis � jour le 19 octobre 2004 Aurelien.Regat-Barrel

L'utilisation de istringstream permet de convertir une string en n'importe quel type pour lequel l'op�rateur istream::operator >>() a �t� d�fini. Il est donc possible de cr�er une fonction g�n�rique de conversion d'une string en un autre type gr�ce � l'utilisation des templates :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <sstream>   
  
template<typename T> 
bool from_string( const std::string & Str, T & Dest ) 
{ 
    // cr�er un flux � partir de la cha�ne donn�e 
    std::istringstream iss( Str ); 
    // tenter la conversion vers Dest 
    return iss >> Dest != 0; 
} 
  
int main() 
{     
    int dix; 
    from_string( "10", dix ); 
}
Pour la conversion d'une string en une cha�ne de caract�res constante (const char *), utilisez la fonction membre c_str() de std::string.
Pour la conversion d'une string en une cha�ne de caract�res modifiable, consultez Comment convertir une string en char*�?
Pour des d�tails sur le principe de la conversion avec l'op�rateur >>, consultez Comment fonctionne le test de r�ussite de conversion if ( str >> num ) ?

Mis � jour le 19 octobre 2004 Aurelien.Regat-Barrel

D'une mani�re g�n�rale, le probl�me de la conversion d'une cha�ne majuscule en minuscule (ou inversement) est bien plus complexe qu'il n'y para�t. C'est un sujet qui d�borde du cadre de cette FAQ, mais voici un rapide aper�u des probl�mes soulev�s :

  • les caract�res diacritiques posent probl�me. Le changement de casse n�cessite la conservation des accents, mais il arrive qu'on �crive des mots en majuscule sans leurs accents. Par exemple, si "f�te" doit �tre transcrit en � F�TE �, parfois on souhaite obtenir � FETE �. Si l'absence d'accentuation pour les majuscules est plus facilement accept�e, c'est rarement le cas pour les minuscules : � FETE � doit �tre converti en � f�te �. Cela implique une conversion d�pendante du contexte (orthographe). Et que dire des phrases ambigu�s que seul le contexte s�mantique peut d�partager : � UN INTERNE TUE A L'ASILE PSYCHIATRIQUE � : est-ce un interne ou un intern� ? A-t-il tu� ou a-t-il �t� tu� ?
  • certains caract�res ne doivent pas �tre convertis en minuscule, comme celui du d�but d'une phrase ou encore d'un nom propre. Par exemple, la phrase � MERCI M. DUPONT � devrait normalement �tre convertie en � Merci M. Dupont �. Bien �videment, c'est une t�che extr�mement complexe � r�aliser de mani�re automatis�e ;
  • dans certaines langues, un caract�re majuscule ne correspond pas forc�ment � un seul caract�re minuscule, et inversement. Ainsi, en Allemand par exemple, la combinaison de majuscules SS peut correspondre soit � la combinaison de minuscule ss, soit � l'unique lettre minuscule � et quelques fois, les deux sont m�me permis (Masse/Ma�e). Ajoutez � cela que les Suisses et les Autrichiens ont des r�gles diff�rentes, et l'on comprend mieux la complexit� du probl�me.

Si l'on se recentre sur le C++, la solution classique (qui est aussi celle g�n�ralement attendue) est d'effectuer une conversion in-place (� en place �, c'est-�-dire directement sur la cha�ne, caract�re par caract�re) au moyen de toupper (pour mettre en majuscule) ou tolower (pour mettre en minuscule). std::transform est traditionnellement utilis� pour appliquer une de ces fonctions � chaque caract�re d'une cha�ne.

Pour convertir une string en minuscule ou en majuscule, il faut appliquer la fonction std::tolower / std::toupper � chaque caract�re, ce que l'on peut r�aliser par exemple gr�ce � std::transform.
Cependant, std::tolower et std::toupper attendent un param�tre compris dans l'intervalle [0...UCHAR_MAX] (ou EOF), et un char peut potentiellement �tre n�gatif (les caract�res accentu�s, par exemple). Utiliser directement ces fonctions provoquerait donc un comportement ind�fini par la norme, c'est pourquoi il faut ajouter un traitement interm�diaire afin de convertir les caract�res dans le bon type (unsigned char ici).

Code c++ : S�lectionner tout
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
#include <cctype>    // pour tolower et toupper 
#include <string>    // pour string 
#include <iostream>  // pour cout 
#include <algorithm> // pour transform 
  
struct my_tolower 
{  
    char operator()(char c) const  
    { 
        return std::tolower(static_cast<unsigned char>(c)); 
    }  
}; 
  
struct my_toupper 
{  
    char operator()(char c) const  
    { 
        return std::toupper(static_cast<unsigned char>(c)); 
    }  
}; 
  
int main() 
{ 
    std::string s("ABCDEF"); 
  
    std::transform(s.begin(), s.end(), s.begin(), my_tolower()); 
    std::cout << s; // affiche "abcdef" 
  
    std::transform(s.begin(), s.end(), s.begin(), my_toupper()); 
    std::cout << s; // affiche "ABCDEF" 
  
    return 0; 
}
Si vous n'�tes pas familier avec l'�criture utilis�e pour my_tolower et my_toupper, voir Qu'est-ce qu'un foncteur ?.
Ceux qui recherchent des explications pouss�es et une solution compl�tement fonctionnelle pour la conversion minuscules/majuscules peuvent consulter cette discussion sur fr.comp.lang.c++.

Pour plus d'efficacit�, on pourra utiliser les biblioth�ques ICU (International Components for Unicode) ou Boost.Locale.

Mis � jour le 6 juillet 2014 3DArchi Aurelien.Regat-Barrel Laurent Gomila

Le code suivant compile mais ne donne pas le r�sultat attendu :

Code c++ : S�lectionner tout
string s = 0;
Ce code ne produit pas la cha�ne "0". Il compile car le z�ro est interpr�t� comme un pointeur NULL. Certains compilateurs permissifs acceptent m�me un nombre diff�rent de z�ro, ce qui peut avoir des cons�quences d�sastreuses (acc�s al�atoire � une zone m�moire).
Il n'est pas possible d'initialiser directement une string avec un nombre. Il faut convertir celui-ci en cha�ne de caract�res puis utiliser ce r�sultat. La question Comment convertir un nombre en une string ? explique comment r�aliser cela.

Mis � jour le 19 octobre 2004 Aurelien.Regat-Barrel

Proposer une nouvelle r�ponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

Les sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.