À QUOI ÇA SERT ?
Les chaînes servent à représenter du texte.
Mais en C++, il existe plusieurs modèles :
- chaînes C ;
- std::string ;
- std::wstring ;
- UTF-8/UTF-16/UTF-32.
1. CHAÎNE C
Code: Select all
const char* text = "Hello";
Code: Select all
'H' 'e' 'l' 'l' 'o' '\0'
C’est essentiel.
Sans terminateur nul, les fonctions C ne savent pas où la chaîne se termine.
2. strlen
Code: Select all
strlen("Hello")
Le '\0' final n’est pas compté dans la longueur logique.
Mais pour le stockage, il faut 6 octets.
3. RISQUE DES BUFFERS C
Code: Select all
char buffer[8];
C’est le classique buffer overflow.
4. std::string
Code: Select all
std::string text{"Hello"};
- allocation ;
- taille ;
- capacité ;
- copies ;
- destruction.
Code: Select all
text += " World";
5. size()
Code: Select all
text.size()
Très important avec UTF-8.
6. c_str()
Code: Select all
const char* ptr = text.c_str();
Pour appeler une API C qui attend :
Code: Select all
const char*
7. INVALIDATION
Code: Select all
const char* ptr = text.c_str();
text += " beaucoup de texte";
Donc ne garde pas aveuglément un pointeur interne après modification du conteneur.
8. WINDOWS ET UTF-16
Les API Win32 Unicode utilisent souvent wchar_t.
Code: Select all
CreateFileW(
L"C:\\test.txt",
...
);
Tu rencontreras :
- LPCWSTR ;
- LPWSTR ;
- WCHAR ;
- std::wstring.
9. UTF-8
Une chaîne UTF-8 utilise des unités char/char8_t selon l’API.
Un caractère Unicode peut nécessiter plusieurs octets.
Donc :
nombre d’octets != forcément nombre de caractères visibles.
À RETENIR
Chaîne C :
pointeur + octets + '\0'.
std::string :
objet qui gère sa mémoire.
Sous Windows :
UTF-16 et wchar_t sont extrêmement importants.
