Bases de C/C++

Les chaînes en C et en C++

Dans cette leçon, vous allez comparer les tableaux de caractères du C et std::string du C++ pour obtenir la longueur, concaténer, comparer et rechercher dans une chaîne.

Introduction

C stocke le texte dans des tableaux de char terminés par un caractère invisible, '\0', et c'est au programmeur de garantir que le tableau a assez de place. C++ propose std::string, un type de chaîne qui gère lui-même sa mémoire et rend le travail sur le texte bien plus sûr et pratique.

Points importants

  • Activez les avertissements du compilateur (compiler warnings) et corrigez-les tous.
  • Comprenez bien le type et la durée de vie (lifetime) de chaque valeur.
  • Vérifiez toujours les données d'entrée et les limites des indices de tableau.

Exemples de code C et C++

C
Exécuter →
main.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void) {
    /* A C string is a char array that ends with '\0'. */
    char name[32] = "Ada";
    printf("%s has %zu letters\n", name, strlen(name));

    /* strcat appends; the array must have room for the result. */
    strcat(name, " Lovelace");
    printf("%s\n", name);

    /* strcmp returns 0 when two strings are equal. */
    printf("equal: %d\n", strcmp("cat", "cat") == 0);

    /* Walk the characters until the terminating '\0'. */
    char upper[32];
    size_t i = 0;
    for (; name[i] != '\0'; i++) {
        upper[i] = (char)toupper((unsigned char)name[i]);
    }
    upper[i] = '\0';
    printf("%s\n", upper);

    /* strstr finds a substring and returns a pointer to it, or NULL. */
    printf("contains \"love\": %s\n", strstr("lovelace", "love") ? "yes" : "no");
    return 0;
}
Résultat de l’exécution
Ada has 3 letters
Ada Lovelace
equal: 1
ADA LOVELACE
contains "love": yes
C++
Exécuter →
main.cpp
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>

int main() {
    // std::string manages its own memory and grows as needed.
    std::string name = "Ada";
    std::cout << name << " has " << name.size() << " letters\n";

    name += " Lovelace";
    std::cout << name << '\n';

    // == compares the contents of two strings.
    std::cout << "equal: " << (std::string("cat") == "cat") << '\n';

    std::string upper = name;
    std::transform(upper.begin(), upper.end(), upper.begin(),
                   [](unsigned char c) { return static_cast<char>(std::toupper(c)); });
    std::cout << upper << '\n';

    // find returns std::string::npos when the text is missing.
    std::string word = "lovelace";
    std::cout << "contains \"love\": " << (word.find("love") != std::string::npos ? "yes" : "no") << '\n';
    std::cout << "first name: " << name.substr(0, 3) << '\n';
}
Résultat de l’exécution
Ada has 3 letters
Ada Lovelace
equal: 1
ADA LOVELACE
contains "love": yes
first name: Ada

Comparaison entre C et C++

En C, les fonctions strlen, strcat, strcmp et strstr travaillent directement sur les tableaux de caractères, et si le tableau n'est pas assez grand lors d'une concaténation, le programme peut subir un dépassement de tampon (buffer overflow). std::string offre size(), +=, ==, find() et substr() et agrandit sa mémoire tout seul si besoin, ce qui évite ce problème.

C

C utilise de petites fonctions procédurales et montre ouvertement comment les données sont représentées en mémoire.

C++

C++ permet toujours de travailler à bas niveau, mais ajoute des types de bibliothèque et des abstractions plus sûres.

Exercices d'approfondissement

Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.

  • Testez des entrées invalides et des valeurs limites.
  • Compilez avec les options -Wall -Wextra -Wpedantic pour activer davantage d'avertissements.
  • Placez les déclarations communes dans un fichier d'en-tête et l'implémentation dans un fichier séparé.

S'entraîner avec un défi

Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.

Tous les défis