6.3.3 Et si on faisait bugger les strings

Évidemment, comme ça, ça sonne un peut sadique, mais ça peut dépanner.

Mais quel est l’intérêt de faire bugger les strings ?

Peut-être que bug est un peut fort. Disons plutôt une curiosité qu'il est bon de connaître.

Et pour voir cette curiosité, nous allons faire du C et du C++ en même temps, pour que vous voyez qu'il n'y a aucune différence.

Écrivez le petit programme qui suit :

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char** argv){
        string str("mettons des mots\0 et d'autres mots");
        cout << str << endl;
        printf("%s\n", str.c_str());

        return 0;
}

Appelons le compilateur :

g++ -Wall main.cpp -o test

Et regardons le résultat :

./test 
mettons des mots
mettons des mots

Étonnant non ?

Évidemment, je vous doit une petite explication.

Vous avez remarqué la présence d'un caractère bizarre dans la chaîne de caractères, j'ai nommé '\0'.

C'est le caractère nul.

Et alors ?

Le caractère nul est le caractère qui termine toutes les chaînes de caractères (et pas seulement les std::strings, mais aussi les char* et autres const char*).

A mon tout de vous poser une question.

Ça ne vous a jamais étonné d'appeler des fonctions comme printf sans passer la taille du tableau ou le nombre de caractères ?

Et bien voilà la réponse, tout les fonctions comme printf, strstr & co, considèrent une chaîne de caractères jusqu'au caractère '\0', et pas un de plus.

Donc, si un jour vous perdez la fin d'une chaîne de caractère, vous savez pourquoi.