OVH Cloud OVH Cloud

string

31 réponses
Avatar
Christophe
Bonjour
J'ai cru lire que les fonctions telles que strcpy, strcmp, etc. sont
déconseillées au profit de la classe string.
Cependant dans mon fameux Deitel & Deitel chapitre5/21 :-( l'auteur
persiste
à vouloir me faire faire des exercices genre strlen...
Est ce bien utile ?
Merci d'avance.

Christophe

10 réponses

1 2 3 4
Avatar
Jean-Marc Bourguet
"Thomas Parle" writes:

"Fabien LE LEZ" a écrit dans le message de news:

On Wed, 24 Dec 2003 14:51:26 +0100, "Thomas Parle"
wrote:

Bah oui, mais balancer des pointeurs et des tableaux à la C à des
débutants n'est AMHA pas une bonne idée.
AMHA toujours, il faut d'abord étudier les structures simples
d'utilisation (vector<>, string, etc.) et ensuite s'occuper de trucs
tordus comme l'agencement de la mémoire par le système, etc.


D'accord sur le principe, mais manipuler les templates de la STL doit-il
être une étape antérieure ou non à la manipulation de types de base comme
les pointeurs ?


En quoi les types de la bibliothèque standards sont ils différents des
types de base? En quoi cette différence devrait-elle impliquer qu'il
faut commencer par apprendre les types de bases?

Vaut-il mieux commencer par le C avant le C++ ? Je n'ai pas
de réponse !


Quel est l'objectif? Si c'est apprendre le C++ la réponse est connue:
non.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
James Kanze
Fabien LE LEZ writes:

|> On Wed, 24 Dec 2003 11:40:31 +0100, Remy Deslignes
|> wrote:

|> >De plus, les fonctions systemes travaillent generalement en char*

|> Du coup std::vector<char> est effectivement plus utile que
|> std::string pour construire l'interface vers ces fonctions
|> système.

Même pas. J'utilise std::string::c_str(), sans le moindre
problème.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Gabriel Dos Reis writes:

|> Remy Deslignes writes:

|> | Christophe wrote:

|> | > J'ai cru lire que les fonctions telles que strcpy, strcmp, etc.
|> | > sont déconseillées au profit de la classe string.
|> | > Cependant dans mon fameux Deitel & Deitel chapitre5/21 :-(
|> | > l'auteur persiste à vouloir me faire faire des exercices
|> | > genre strlen...
|> | > Est ce bien utile ?

|> | lol ...
|> | Oui ca peut servir ;-).

|> pour allumer un feu de bois ?

C'est bien pour générer des core dumps, ou des problèmes de
sécurité, aussi.

À moi, ça me fait aussi un peu rire quand j'entends des histoires
de bufferisation cachée, etc. C'est un peu comme les gens d'il y a
vingt ans, qui se vantait d'avoir gagné une microséconde dans le
temps d'execution de la boucle interne d'un tri à bulle. C'est bien
beau, mais mon quicksort toute écrit en C (à l'époque), sans la
moindre optimisation, était quand même plus rapide.

Dans la pratique, je constate que les programmes des gens qui
s'acharnent à se servir de strlen, etc., à la place de std::string
sont en général moins rapides. Et que je ne me suis pas servi de
strlen etc. depuis que je me suis mis à C++, à part
l'implémentation de certains constructeurs de ma propre classe de
chaîne, avant qu'il y avait celle de la norme.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
"Thomas Parle" writes:

|> "Fabien LE LEZ" a écrit dans le message de news:
|>
|> > On Wed, 24 Dec 2003 10:39:05 +0100, "Christophe"
|> > wrote:

|> > >l'auteur persiste à vouloir me faire faire des exercices genre
|> > >strlen... Est ce bien utile ?

|> > On va dire que ce ne sont pas des connaissances pratiques, c'est
|> > juste de la culture générale -- un peu comme les cours
|> > d'histoire au collège/lycée.

|> Pour débuter, ça peut être un bon exercice de manipulation
|> de pointeurs/tableaux/etc...pour voir comment ça marche.
|> Après, on peut passer à autre chose de plus sophistiqué,
|> mais n'importe qui doit savoir maitriser ces opérations de bases
|> qui servent toujours je pense.

Quelles opérations de base qui servent toujours ? La seule
opération de base qui sert toujours dans strlen, c'est l'appel d'une
fonction, et ça, je crois qu'on risque de la voir de toute façon.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
"Thomas Parle" writes:

|> "Fabien LE LEZ" a écrit dans le message de news:
|>
|> > On Wed, 24 Dec 2003 14:51:26 +0100, "Thomas Parle"
|> > wrote:

|> > Bah oui, mais balancer des pointeurs et des tableaux à la C
|> > à des débutants n'est AMHA pas une bonne idée. AMHA
|> > toujours, il faut d'abord étudier les structures simples
|> > d'utilisation (vector<>, string, etc.) et ensuite s'occuper de
|> > trucs tordus comme l'agencement de la mémoire par le
|> > système, etc.

|> D'accord sur le principe, mais manipuler les templates de la STL
|> doit-il être une étape antérieure ou non à la
|> manipulation de types de base comme les pointeurs ?

Pourquoi ? Je ne me sers absolument pas de l'arithmétique sur
pointeurs dans mes applications en C++. Je le connais, parce que je
viens de C (et avant ça, même, j'ai fait beaucoup d'assembleur),
mais je trouve que son utilité est limitée à
l'implémentation des bibliothèques de base. Et que maintenant
qu'on a la bibliothèque standard, il n'y a plus tellement de raisons
d'implémenter les choses d'aussi bas niveau sauf si on implémente
une bibliothèque standard.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Fabien LE LEZ
On 26 Dec 2003 12:10:59 +0100, James Kanze
wrote:

|> Du coup std::vector<char> est effectivement plus utile que
|> std::string pour construire l'interface vers ces fonctions
|> système.

Même pas. J'utilise std::string::c_str(), sans le moindre
problème.


A condition que la fonction de l'API ne modifie pas la chaîne.

--
;-)

Avatar
James Kanze
Fabien LE LEZ writes:

|> On 26 Dec 2003 12:10:59 +0100, James Kanze
|> wrote:

|> >|> Du coup std::vector<char> est effectivement plus utile que
|> >|> std::string pour construire l'interface vers ces fonctions
|> >|> système.

|> >Même pas. J'utilise std::string::c_str(), sans le moindre
|> >problème.

|> A condition que la fonction de l'API ne modifie pas la chaîne.

En effet. Dans ce cas-là, je dirais que ça dépend -- la plupart
du temps, je passeais bien un char[], que je convertirai en std::string
tout de suite après l'appel. Mais il y a plusieurs choses auxquelles
il faut prêter attention : à commencer par la longueur :

- Si la fonction prend aussi la longueur comme paramètre, il faut
bien vérifier si c'est la longueur avec ou sans le ''.

- Si la fonction exige une longueur qu'elle a prédéfinie
(typiquement au moyen d'un #define), pareil.

- Et finalement, si la fonction ne permet pas la spécification de
la longueur, ni du côté de l'utilisateur, ni de son
côté, on ne s'en sert pas. N'importe l'intérêt de sa
fonctionalité.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Fabien LE LEZ
On 27 Dec 2003 10:07:25 +0100, James Kanze
wrote:

En effet. Dans ce cas-là, je dirais que ça dépend -- la plupart
du temps, je passeais bien un char[]


J'ai recontré de temps en temps, notamment dans l'API Win32, des
fonctions qui ont un comportement particulier : elles acceptent un
buffer (char*) et sa longueur, et râlent si le buffer est trop
petit[*] -- auquel cas il faut agrandir le buffer et appeler à nouveau
la fonction. std::vector<char> est extrêmement bien adapté à ce cas.

[*] variante : si le buffer est trop petit, on s'en aperçoit parce que
le '' de fin de chaîne n'est pas présent.

D'autres fonctions ont une fonction annexe, qui renvoie la longueur de
la chaîne. Dans ce cas, un "new char[]" conviendrait, mais là encore
vector<char> est quand même plus agréable.

- Et finalement, si la fonction ne permet pas la spécification de
la longueur, ni du côté de l'utilisateur, ni de son
côté, on ne s'en sert pas. N'importe l'intérêt de sa
fonctionalité.


Tu veux parler de gets() ? ;-)


--
;-)

Avatar
James Kanze
Fabien LE LEZ writes:

|> On 27 Dec 2003 10:07:25 +0100, James Kanze
|> wrote:

|> >En effet. Dans ce cas-là, je dirais que ça dépend -- la
|> >plupart du temps, je passeais bien un char[]

|> J'ai recontré de temps en temps, notamment dans l'API Win32, des
|> fonctions qui ont un comportement particulier : elles acceptent un
|> buffer (char*) et sa longueur, et râlent si le buffer est trop
|> petit[*] -- auquel cas il faut agrandir le buffer et appeler à
|> nouveau la fonction. std::vector<char> est extrêmement bien
|> adapté à ce cas.

Tout à fait (bien que j'ai une classe pré-norme exprès pour
ça -- il y a des interfaces semblable dans Unix).

Je pensais plutôt à des fonctions (nombreuses dans l'API de Unix)
où il y a une #define avec la longueur maximum. Dans ce cas-là, si
ce que tu veux à la fin est une std::string, ce n'est vraiment pas la
peine de passer par std::vector.

|> [*] variante : si le buffer est trop petit, on s'en aperçoit
|> parce que le '' de fin de chaîne n'est pas présent.

|> D'autres fonctions ont une fonction annexe, qui renvoie la longueur
|> de la chaîne. Dans ce cas, un "new char[]" conviendrait, mais
|> là encore vector<char> est quand même plus agréable.

|> > - Et finalement, si la fonction ne permet pas la spécification
|> > de la longueur, ni du côté de l'utilisateur, ni de son
|> > côté, on ne s'en sert pas. N'importe l'intérêt de
|> > sa fonctionalité.

|> Tu veux parler de gets() ? ;-)

Et sprintf. On ne s'en sert pas. En aucun cas.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Loïc Joly
Christophe wrote:

Bonjour
J'ai cru lire que les fonctions telles que strcpy, strcmp, etc. sont
déconseillées au profit de la classe string.
Cependant dans mon fameux Deitel & Deitel chapitre5/21 :-( l'auteur
persiste
à vouloir me faire faire des exercices genre strlen...
Est ce bien utile ?


Je dirais que tout programmeur C++ aura un jour du code C (ou C++ écrit
par quelqu'un ne maitrisant vraiment que le C) à
lire/comprendre/corriger/adapter/porter...

Dans cette optique, ça peut être pas mal de savoir le principe général
de fontionnement des chaines à la C (ce qui est aussi utile pour
s'interfacer avec du code C), et de pouvoir trouver rapidement une bonne
référence.

Je ne vois par contre pas l'intérêt d'apprendre ces fonctions pour un
débutant.

--
Loïc

1 2 3 4