OVH Cloud OVH Cloud

help char* et char[xx]

20 réponses
Avatar
Vincent
bonjour,

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une méthode qui
veut un char*.
Comment passer du char[300] à un char* ? merci!!

Comment passe t'on une chaine en paramètre dans une méthode?
cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction

et avec un char toto[30] ?

merci

Vincent

10 réponses

1 2
Avatar
Andre Heinen
On Thu, 7 Jul 2005 17:43:31 +0200, "Vincent"
wrote:

char *toto;
char titi[20];
pour strcpy(toto,titi);
ca plantait parceque je n'avais pas fait de malloc de toto avec la longueur
de titi !


N'oublie pas d'allouer un caractère supplémentaire pour le zéro de fin
de chaîne.

--
André Heinen
Mon e-mail, encodé ROT13: n qbg urvara ng rhebcrnayvax qbg pbz
La FAQ: http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/

Avatar
Michel Michaud
Dans le message daiici$d0t$,
char toto[30];
ma_fonction(&(toto[0]));


Ouch ! Pourquoi faire simple quand on peut faire compliqué...

cout << toto ; // toto modifié par ma_fonction

ai pas vérifié avec un compilo, mais il me semble que tout est ok,
rem, un bon bouquin avec plein d'astuces de ce type : C/C++, la
bible du programmeur aux Ed Reynald Goulet.


On l'a souvent dit ici, mais comme ça semble un gros vendeur : ce
bouquin est vraiment mauvais (voir par exemple la critique de accu
http://www.accu.org/cgi-bin/accu/rvout.cgi?from
u_j&file=j001569a) et la
traduction française n'améliore pas les choses ! Ceci dit je
ne sais pas si ton « astuce » vient de là, je ne croyais pas que
c'est aussi pire que ça...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
kanze
Michel Michaud wrote:
Dans le message daiici$d0t$,
char toto[30];
ma_fonction(&(toto[0]));


Ouch ! Pourquoi faire simple quand on peut faire compliqué...


Pour être compatible le jour où on remplace le char[30] avec
std::vector:-) ?

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Stan
"Michel Michaud" a écrit dans le message de news:
_%ize.10115$
On l'a souvent dit ici, mais comme ça semble un gros vendeur : ce
bouquin est vraiment mauvais (voir par exemple la critique de accu
http://www.accu.org/cgi-bin/accu/rvout.cgi?from
u_j&file=j001569a) et

la traduction française n'améliore pas les choses ! Ceci dit je
ne sais pas si ton « astuce » vient de là, je ne croyais pas que
c'est aussi pire que ça...

J'ai beaucoup aimé le dernier paragraphe.

Chez nous on dit que ça peut remplacer un pied de bureau cassé.
Un ouvrage à lire pour ceux qui veullent s'assurer un bel avenir
professionnel
ds la prg C++.


--
-Stan

Avatar
JBB
int streql(char *str1, char *str2) {
while ((*str1 == *str2) && (*str1)) {
str1++;
str2++;
}
return((*str1 == NULL)
&& (*str2 == NULL));
}

Vous voyez quoi comme problemes avec cette fonction ?
- inutile car strcmp existe
- ne fait pas de comparaison comme strcmp ( on a du coup besoin d'une
autre fonction)
- ferait mieux de prendre des const char * ( ca permettrait de l'appeler
avec des chaines const et garantirait que les chaines ne sont pas modifiés)
- plante si str1 ou str2 sont nuls ( mais strcmp ne fait pas mieux)
- problemes si les strings ne sont pas terminés par 0 ( strcmp ne doit
pas faire mieux)
- pas tres performante si str1 == str2

Globalement c'est pas si terrible que ça.
(Je vois bien pire dans les projets auxquels je participe).
Avatar
JBB
int streql(char *str1, char *str2) {
while ((*str1 == *str2) && (*str1)) {
str1++;
str2++;
}
return((*str1 == NULL)
&& (*str2 == NULL));
}

Vous voyez quoi comme problemes avec cette fonction ?
- inutile car strcmp existe
- ne fait pas de comparaison comme strcmp ( on a du coup besoin d'une
autre fonction)
- ferait mieux de prendre des const char * ( ca permettrait de l'appeler
avec des chaines const et garantirait que les chaines ne sont pas modifiés)
- plante si str1 ou str2 sont nuls ( mais strcmp ne fait pas mieux)
- problemes si les strings ne sont pas terminés par 0 ( strcmp ne doit
pas faire mieux)
- pas tres performante si str1 == str2
J'avais oublié:

*str2 == NULL tres moche normallement NULL est utilisé pour les pointeurs.
Globalement c'est pas si terrible que ça.
(Je vois bien pire dans les projets auxquels je participe).


Y a des cas ou elle marche pas ?

Avatar
Stan
"JBB" a écrit dans le message de news:
42ce5272$0$18620$
int streql(char *str1, char *str2) {
while ((*str1 == *str2) && (*str1)) {
str1++;
str2++;
}
return((*str1 == NULL)
&& (*str2 == NULL));
}

Vous voyez quoi comme problemes avec cette fonction ?


Elle ne fonctionne pas avec des wide character.


Globalement c'est pas si terrible que ça.
(Je vois bien pire dans les projets auxquels je participe).


Cette forme d'écriture correspond a du C, lorsqu'on
utilise C++, autant coder en utilisant ses paradigmes.


--
-Stan

Avatar
James Kanze
JBB wrote:
int streql(char *str1, char *str2) {
while ((*str1 == *str2) && (*str1)) {
str1++;
str2++;
}
return((*str1 == NULL)
&& (*str2 == NULL));
}


Vous voyez quoi comme problemes avec cette fonction ?


J'ai du mal à y voir quelque chose du bien. C'est extrèmement
mal écrite, et ne passerait aucune revue de code.

En plus, il s'adresse à un problème C, et ce n'est même pas du C
légal.

En somme, l'auteur a bien montré qu'il ne connaît ni du C ni du
C++.

- inutile car strcmp existe


En C++, inutile, car std::string existe, et supporte == et ! directement.

En C, éventuellement utile, mais il doit renvoyer bool
(aujourd'hui, en tout cas), et de toute façon, le code n'est
même pas légal en C. (Mais il faut bien en tenir compte que les
autres programmeurs qui vont lire ton code connaissent tous
strcmp, mais non ta fonction.)

- ne fait pas de comparaison comme strcmp ( on a du coup
besoin d'une autre fonction)


Je suppose d'après le nom que ce n'est pas son rôle.

- ferait mieux de prendre des const char * ( ca permettrait de
l'appeler avec des chaines const et garantirait que les
chaines ne sont pas modifiés)


C'est effectivement le premier criticisme de l'implémentation.
Encore plus grave, c'est le fait de comparer un char (le
résultat de *str1 et de *str2) à NULL. Ça marche en C++, même
si c'est de très mauvais style ; ça ne marche même pas en C.

Question de style, évidemment, tous les parenthèses en trop dans
l'expression dans le while fait poser des questions. Et en 2005,
franchement...

En fait, il n'y a qu'une seule « bonne » implémentation de cette
fonction dans un projet commercial :

bool
streql( char const* str1, char const* str2 )
{
return strcmp( str1, str2 ) == 0 ;
}

En admettant, en revanche, qu'on préfère ne pas se servir de
l'existant pour des raisons pédagogiques, on pourrait imaginer
quelque chose comme :

bool
strequ( char const* str1, char const* str2 )
{
while ( *str1 != '' && *str1 == *str2 ) {
++ str1 ;
++ str2 ;
}
return *str1 == '' && *str2 == '' ;
}

- plante si str1 ou str2 sont nuls ( mais strcmp ne fait pas mieux)


Évidemment, j'aurais inséré un assert au début. Dans du code
professionnel, s'entend. Dans un livre où le but pédégogique est
de montrer quelque chose d'autre, je ne sais pas.

Je suppose, évidemment, que le texte accompagnant a déjà parlé
de ce problème, et a bien dit que des pointeurs non-nuls est une
précondition.

- problemes si les strings ne sont pas terminés par 0 ( strcmp ne doit
pas faire mieux)


C'est un problème de base avec les chaînes à la C. C'est une des
raisons pourquoi on ne s'en sert jamais en C++.

- pas tres performante si str1 == str2


Qu'importe.

Globalement c'est pas si terrible que ça.


Globalement, c'est une des pires exemples de C que je n'ai
jamais vu.

(Je vois bien pire dans les projets auxquels je participe).


Moi non. Et il m'est arrivé de voir des choses pas très jolies.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Avatar
Michel Michaud
Dans le message 42ce5272$0$18620$,
Vous voyez quoi comme problemes avec cette fonction ?


Il y a beaucoup de problèmes, comme plusieurs (et même toi)
l'ont fait remarquer.

Globalement c'est pas si terrible que ça.


Oui, c'est terrible parce que même s'il fallait écrire cette
fonction (ce qui est très discutable...), elle est simple et
si courte qu'il n'y a aucune excuse possible pour en présenter
une si mauvaise version dans un livre se voulant écrit par un
expert ! Une fois qu'on a vu cet exemple, on doit mettre en
doute tout ce qui est dit ailleurs dans le livre, ce qui rend
tout à fait sans intérêt et même dangereux.

(Je vois bien pire dans les projets auxquels je participe).


Peut-être qu'on peut faire pire, mais est-ce que c'est normal
et peut-on vraiment penser qu'il ne faut pas apprendre à faire
mieux ?

Et surtout, est-ce que ceux qui écrivent du code pire ont
écrit un livre et se présentent comme des experts ?

En passant, il semble qu'il y a une nouvelle version de ce livre,
qui couvre maintenant C, C+ et C#. J'imagine que la version
C/C++/C#/Java/Javascript s'en vient... :-(

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
JBB
Dans le message 42ce5272$0$18620$,

Vous voyez quoi comme problemes avec cette fonction ?



Il y a beaucoup de problèmes, comme plusieurs (et même toi)
l'ont fait remarquer.

Globalement c'est pas si terrible que ça.



Oui, c'est terrible parce que même s'il fallait écrire cette
fonction (ce qui est très discutable...), elle est simple et
si courte qu'il n'y a aucune excuse possible pour en présenter
une si mauvaise version dans un livre se voulant écrit par un
expert ! Une fois qu'on a vu cet exemple, on doit mettre en
doute tout ce qui est dit ailleurs dans le livre, ce qui rend
tout à fait sans intérêt et même dangereux.

Effectivement, si ça doit servir d'exemple ça craint.

(Peut etre est ce un stagiaire qui a fait les exemples...)

(Je vois bien pire dans les projets auxquels je participe).


Peut être se servaient t'ils de ce livre comme référence ...


Peut-être qu'on peut faire pire, mais est-ce que c'est normal
et peut-on vraiment penser qu'il ne faut pas apprendre à faire
mieux ?

Et surtout, est-ce que ceux qui écrivent du code pire ont
écrit un livre et se présentent comme des experts ?

Pas vraiment. C'etaient plutôt des débutants embauchés à l'époque ou les

SSI engagaient des chimistes et des biologistes...fautes d'informaticiens.

En passant, il semble qu'il y a une nouvelle version de ce livre,
qui couvre maintenant C, C+ et C#. J'imagine que la version
C/C++/C#/Java/Javascript s'en vient... :-(



C'est bon je suis convaincu.


1 2