pourquoi les "char" sont "néfastes" pour les débutants é le sont-ils vraiment ????????
pourquoi les "char" sont "néfastes" pour les débutants é le sont-ils vraiment ????????
Le type "char" n'est absolument pas nocif pour un débutant...
Ce qui est nocif, car sujet à de nombreux problèmes qui peuvent ete évités, c'est l'utilisation d'un tableau de char pour créer une chaine de caractères au lieu de la classe std::string...
En effet, un tableau de caractères fournis une chaine "C style", qui est soumise à - entre autres - tous les problèmes rencontrés avec les tableaux:
- comportement indéfinis en cas de mauvaise initialisation,
- problèmes propres au dépassement de capacité (11 caractères dans un tableau prévu pour en contenir 10)
- ...
La classe std::string est suffisemment robuste pour permettre d'éviter risquer de se "tirer dans le pieds" et pour limiter ce genre de problème, tout en permettant, finalement, tout ce qui est possible avec les chaine "C style".
En cela, les chaines de caractères C style sont "nocives" (disons plutot: moins bien adaptée, moins faciles à utiliser, plus source d'erreur) mais ce n'est nullement un point de vue à élargir au type char
Le type char est à utiliser chaque fois que, réellement, tu veux travailler sur un caractère qui, d'une manière ou d'une autre, peut etre considéré comme étant pris séparément de l'ensemble des caractères composant une chaine(ou pour toute valeur ayant une fouchette comprise dans celle correspondant au type char)
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Je seconde globalement les propos du phascolarctidé, et ajoute juste un autre risque, cette fois-ci lié aux chars eux même : Certains font des suppositions sur la façon dont certains caractères sont codés, et utilises ces suppositions peu fondées (même si ça a l'air de marcher avec le compilateur courant), pour par exemple dire que 'A' + 1 serait égal à 'B' ou que l'ordre des char est un ordre alphabétique, ou pour passer en majuscules à base de c - 'a' + 'A'. Ce genre de choses est d'autant plus gênant dans un contexte internationnal.
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Bonjour,
Je ne pense pas que les std::string donnent la solution à ce problème, ou alors un gros truc m'a échappé.Envoyé par JolyLoic
A mon tour.
Le principal problème des char* et autres char[] pour un débutant, c'est que ces types l'éloignent de ce qui est vraiment important à son niveau => l'agorithmie.
De plus, pour qu'il soit à même de produire un semblant de quelque chose, les cours reposant sur ces types primitifs prennent quantité de raccourcis qui introduisent des vulnérabilités, ou des limitations d'un autre âge. Un code correct étant souvent d'une compléxité à dégouter n'importe qui à ce niveau -- voire même après.
Et donc pourquoi s'embéter vu qu'il y a un type chaîne qui s'avère très simple à utiliser correctement ?
Ca, c'est pour les débutants.
Concernant les gens expérimentés. Vu que l'on a autre chose à faire que de se prendre le choux à toujours refaire les mêmes TDs dans nos codes de production, on laisse tomber ces 2 types primitifs au profit de types encapsulant toute la partie pénible liée à la gestion des chaines de caractères.
Au passage, ces types nous offrent une plus grande robustesse et une maintenabilité accrue.
std::string est le type standard pour cela -- diverses bibliothèques graphiques se sentent obligées de définir leur propre type pour les chaînes de caractères.
Après, il nous arrive ponctuellement de revenir à des char* pour des raisons d'optimisation quand on sait qu'il y a à y gagner dans des situations bien précises. Ou pour s'interfacer avec certaines API.
NB: le moment venu, ce débutant enfin initié, et à vocation de devenir informaticien professionnel, devra faire ces TDs où l'on manipule des buffers de char à la main. Le temps de quelques TDs incontournables histoire de comprendre comment ça marche dedans.
Lectures:
-> FAQ, chapite sur les std::string
-> un article de Bjarne Stroustrup au sujet qu'il faut apprendre le C++ comme un langage à part entière, et indépendant, sans s'encombrer de bagages et autres oeillières. (je résume à ma sauce). Le lien est dispo dans un des points de la FAQ qu'il maintient sur son site (google!)
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Comprenons nous bien, en informatique, il n'y a rien de "nocif", rien d'obligatoire, et rien d'interdit...
Par contre, il y a une optique qui est, toujours néfaste et nocive: c'est celle du "pourquoi faire simple quand on peut faire compliqué"...
C'est pour cette simple et unique raison qu'on *conseille tres largement* aux débutants de se tourner vers les std::string plutot que vers les char[]... Et, chose bizare, c'est aussi la raison qui fait que les personnes mieux initiées continuent à utiliser les string plutot que des tableaux de caractères
Bref, autant le dire, il n'est nullement question (du moins de mon point de vue) de "diaboliser" une pratique ou une autre...
Il est plutot question d'utiliser LA technique qui, dans une situation donnée, me donnera le meilleur résultat dans un minimum de temps...
Au fait, savais tu que la grosse majorité du retard intervient, non pas en période de codage, mais du fait du débuggage![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Il ne faut pas pour autant sacrifier flexibilité, généricité et maintenabilité.Il est plutot question d'utiliser LA technique qui, dans une situation donnée, me donnera le meilleur résultat dans un minimum de temps...
Partager