C ne se soucie pas des chaînes. Pas vraiment.
Il les traite comme des tableaux de caractères. Juste des octets en mémoire. Si vous souhaitez les utiliser efficacement, vous avez besoin de conseils. Pas parce que c’est amusant. Mais parce que sans eux, vous faites un travail supplémentaire.
Une chaîne en C est simplement « char str[100] ». Cela ressemble à un espace pour 100 caractères. Ce n’est pas le cas. C’est un espace pour 99 caractères plus un terminateur. C utilise des chaînes terminées par un caractère nul. Chaque chaîne se termine par la valeur ASCII 0. Écrit sous la forme « \0 ».
Cela change tout.
D’autres langages gèrent les chaînes différemment. Pascal utilise un octet de longueur. Il sait exactement combien de caractères sont stockés. Demander la longueur ? Il renvoie cet octet. Immédiatement.
C doit compter. Il lit jusqu’à ce qu’il atteigne « \0 ». Cela rend C plus lent dans certains cas. Plus rapide chez les autres. Cela dépend de ce que vous faites.
Il n’y a pas de support de chaîne intégré en C. Vous comptez sur des bibliothèques. gère les entrées et les sorties comme gets et puts. gère la manipulation. Certains systèmes utilisent . Vous devez gérer vous-même la mémoire. Vous ne pouvez pas simplement attribuer un tableau à un autre.
C’est tout. Vous copiez élément par élément. Ou vous utilisez strcpy. La fonction bibliothèque fait le gros du travail.
strcpy est partout en C. Il initialise les chaînes. Il copie les données.
Après cette exécution, « s1 » contient « bonjour » et « s2 » contient « bonjour ». Le tableau stocke les valeurs ASCII. Entiers. « h » vaut 104. « e » vaut 101. C pense en octets. Vous pensez par texte. La machine s’en fiche.
La comparaison utilise strcmp. Il renvoie un entier.
Zéro signifie égal. Négatif signifie que la première chaîne est inférieure. Positif signifie que c’est plus grand.
D’autres fonctions existent. strlen renvoie la longueur. strcat concatène. Lisez la page de manuel si vous avez besoin de plus.
Mais comment ces fonctions fonctionnent-elles réellement sous le capot ? Regardons « strlen ».
Une approche naïve ressemble à ceci :
La plupart des programmeurs C détestent ça. Cela semble inefficace. Ils préfèrent les pointeurs.
Vous pouvez le compresser davantage.
Un véritable expert pourrait probablement le raccourcir.
Je les ai compilés sur un MicroVAX avec gcc. Aucune optimisation. Exécuté chacun 20 000 fois sur une chaîne de 120 caractères.
Première version : 12,3 secondes.
Deuxième version : 12,3 secondes.
Troisième version : 12,9 secondes.
Les pointeurs ne gagnent pas toujours.
Écrivez du code que vous comprenez. La lisibilité compte plus que quelques microsecondes. Sauf si vous êtes dans une boucle serrée. Alors peut-être optimiser.
strcpy suit une évolution similaire.
Commencez par l’évidence :
Notez le <=. Il copie le « \0 ». Si vous l'ignorez, la chaîne n'a pas de fin. Longueur inconnue. Des bugs plus tard. Difficile à trouver.
Cette version est inefficace. strlen exécute chaque itération. Appelez-le une fois.
Maintenant des pointeurs.
Compressez-le.
Propre. Rapide. Dangereux si vous ne vérifiez pas les limites.
C'est ainsi que fonctionnent les chaînes C. Pas de magie. Juste de la mémoire et des pointeurs. Et beaucoup de comptage minutieux.
Pointeurs par rapport aux performances dans strcpy
Vous pouvez techniquement écrire while (s1++ = s2++); pour gérer la copie de chaînes. L'écart de performances entre les implémentations naïves et les implémentations optimisées est stupéfiant.
Prenez strcpy. La première version prend 415 secondes pour copier 10 000 fois une chaîne de 120 caractères. La deuxième version ? 14,5 secondes. Le troisième tombe à 9,8 secondes. Le quatrième s'installe à 10,3 secondes.
Ce n’est pas une différence marginale. C’est un énorme coup de pouce. Les pointeurs fournissent ici la vitesse car ils évitent une surcharge inutile.
Types de retour et pointeurs de chaîne
Le prototype de strcpy dans la bibliothèque de chaînes révèle son intention :
La plupart des fonctions de chaîne renvoient un pointeur vers une chaîne. strcpy renvoie la valeur de s1 comme résultat. Cela permet d'enchaîner les opérations ou d'utiliser immédiatement la chaîne copiée sans seconde recherche.
Supprimer les espaces vides sans déplacer les données
L’utilisation de pointeurs avec des chaînes entraîne souvent des améliorations nettes de la vitesse. Vous pouvez en profiter si vous y réfléchissez un peu.
Supposons que vous souhaitiez supprimer les espaces de début d’une chaîne. L'instinct est de décaler les caractères, en écrasant les blancs. En C, vous pouvez éviter complètement le mouvement.
C'est beaucoup plus rapide que la technique du mouvement. Surtout pour les longues cordes. Vous ne déplacez pas d'octets. Vous changez simplement le pointeur de départ. Les données restent en place. La sortie change.
Récupérer des astuces
Vous découvrirez de nombreuses autres astuces avec des cordes au fur et à mesure. Vous lirez un autre code. Vous verrez comment les autres gèrent la mémoire.
La pratique est la clé. Il n'y a pas de raccourci pour lire le code. Il suffit de regarder comment cela se fait et de comprendre pourquoi cela fonctionne. Les gains de performances sont réels. La courbe d’apprentissage est abrupte. Mais les résultats parlent d'eux-mêmes.

























