[c++] chaînes de caractères (char *)

chaînes de caractères (char *) [c++] - Programmation

Marsh Posté le 27-06-2002 à 16:08:43    

salut les développeurs !
 
Dites pour une chaîne de caractères, vaut-il-mieux utiliser
char *a;
ou
char *a = new char[255]; ???
Quelle est la différence ?
Je crois que lorsqu'on choisit la 2eme solution, on peut modifier la chaîne avec strcpy(); ou bien manuellement avec
a[5] = 'a';, sachant qu'on ne doit pas dépasser 255 caractères, alors que si on n'ititialise pas avec new, a est un pointeur
vers un tableau de 0 éléments, et donc à la moindre tentative d'écriture dans ce tableau on écrase des zones mémoires ...
Ce qui provoque une erreur lors de l'utilisation de strcpy(); par exemple...
C'est ça ?
Et je suis obligé de détruire avec delete [] a; ???
Si je le fais pas la mémoire va rester occupée je me trompe ? C'est grave ?
 
Et pour passer une chaîne de caractères à une fonction, faut-il vraiment passer aussi le nombre d'éléments de ce tableau ?
Pour passer un tableau standard de int par exemples, on doit passer le nombre (avec 'sizeof(a)/sizeof(a[0])';) car la fonction
qui le récupère n'a pas de moyen de récupérer le nombre d'éléments du tableau, par contre dans le cas d'une chaine de
caractères, le dernier élément du tableau est '\0' donc la fonction qui récupère la chaîne le sait très bien et lit la chaîne
jusqu'à rencontrer '\0'. Par contre la fonction qui récupère la chaîne peut modifier que jusqu'au rang du '\0', pas plus, c'est ça ?
 
Et aussi si j'ai besoin de stocker plusieurs chaînes de cractères j'utilise char **a; ?
Mais comment j'utilise l'opérateur new ici ?
Ensuite chaque chaîne c'est a[0], a[1], a[2], ... ???
 
Encore une question, j'ai des fonctions qui doivent renvoyer plusieurs résultats. Comme ce n'est pas possible, j'ai dans ce cas
créé plusieurs variables globales, que les fonctions modifient au nécéssaire. C'est une bonne méthode ou ya mieux ?
 
 
Merci de votre aide :hello:
 
juju


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 27-06-2002 à 16:08:43   

Reply

Marsh Posté le 27-06-2002 à 16:10:40    

juju_le_barbare a écrit a écrit :

 
char *a;
ou
char *a = new char[255]; ???
Quelle est la différence ?




 
le premier c'est un pointeur non initialisé (tu peux pas l'utiliser tant que tu n'y as pas assigné quelque chose)
le second est un pointeur vers 255 octets, pouvant contenir une chaine de 254 caractères + un 0 par exemple.


Message édité par antp le 27-06-2002 à 16:11:01

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-06-2002 à 16:15:34    

des variables globales, C po terrible :p
si t'as po bcp de valeurs, tu peut faires des passages par references :
 
void toto(int in1, int in2, int &ou1, int &out2)
{
out1 = in1;
out2 = in2;
}
 
void pouet()
{
int var1=1;
int var2=2;
int var3=0;
int var4=0;
 
toto(var1, var2, var3, var4);
===> var3 vaut maintenant 1 et var4 vaut 2


---------------
Hyndex - Meuaarf !! ReZo !!!
Reply

Marsh Posté le 27-06-2002 à 16:17:27    

...et ça voulait faire un défragmenteur ! :sarcastic:  
 :D  :D  :D

Reply

Marsh Posté le 27-06-2002 à 16:18:26    

el_gringo a écrit a écrit :

...et ça voulait faire un défragmenteur ! :sarcastic:  
 :D  :D  :D  




 
hi hi
encore une question, j'ai une chaîne de caractères sur plusieurs lignes ('\n';), comment l'afficher
sous C++ Builder dans une ListBox par exemple ?


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 27-06-2002 à 16:22:21    

juju_le_barbare a écrit a écrit :

 
 
hi hi
encore une question, j'ai une chaîne de caractères sur plusieurs lignes ('\n';), comment l'afficher
sous C++ Builder dans une ListBox par exemple ?




 
Comment ça !?
T'as bien déja fait ça, g vu le 2, 3 trucs que t'as déja programmé, t'as déja affiché du texte ds un champ de texte, non !?
ds une list box, sous C++ Builder, y doit falloir utiliser un TListBox (je sais pas, moi j'utilise VC++, ms bon, j'imagine que c ça.
Et comme membre de ta TListBox, tu dois avoir un AddString, ou qqeu comme ça !

Reply

Marsh Posté le 27-06-2002 à 16:26:33    

juju_le_barbare a écrit a écrit :

 
 
hi hi
encore une question, j'ai une chaîne de caractères sur plusieurs lignes ('\n';), comment l'afficher
sous C++ Builder dans une ListBox par exemple ?




 
Listbox1->Items->Text = chaine;
Items était un TStringList, la propriété Text utilise le retour de ligne comme délimiteur entre les chaînes.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-06-2002 à 16:27:19    

Les réponses sont en bleu :
 

juju_le_barbare a écrit a écrit :

salut les développeurs !
 
Dites pour une chaîne de caractères, vaut-il-mieux utiliser
char *a;
ou
char *a = new char[255]; ???  <<<
Quelle est la différence ?
Je crois que lorsqu'on choisit la 2eme solution, on peut modifier la chaîne avec strcpy();  
 
Un pointeur char* a pointe sur une zone mémoire. Si tu veux y stocker des caractères (ou autre) il faut réserver l'espace mémoire avec new.
 
C'est ça ?
Et je suis obligé de détruire avec delete [] a; ??? OUI
Si je le fais pas la mémoire va rester occupée je me trompe ? C'est grave ? OUI
 
Et pour passer une chaîne de caractères à une fonction, faut-il vraiment passer aussi le nombre d'éléments de ce tableau ? OUI
Pour passer un tableau standard de int par exemples, on doit passer le nombre (avec 'sizeof(a)/sizeof(a[0])';) car la fonction
qui le récupère n'a pas de moyen de récupérer le nombre d'éléments du tableau, par contre dans le cas d'une chaine de
caractères, le dernier élément du tableau est '\0' donc la fonction qui récupère la chaîne le sait très bien et lit la chaîne
jusqu'à rencontrer '\0'. Par contre la fonction qui récupère la chaîne peut modifier que jusqu'au rang du '\0', pas plus, c'est ça ?
 
T'as une fonction qui s'appelle strlen qui rend la taille d'une chaine jusqu'au '\0'
 
Et aussi si j'ai besoin de stocker plusieurs chaînes de cractères j'utilise char **a; ? OUI
Mais comment j'utilise l'opérateur new ici ?
Ensuite chaque chaîne c'est a[0], a[1], a[2], ... ???
 

char** tableauDeChaine = NULL;
tableauDeChaine = new char*[nbDeChaine]; // reserve le tableau de pointeurs
tableauDeChaine[0] = new char[tailleDeChaine]; // reserve une chaine
 
La syntaxe du C++ est orthogonal, tu peux faire des tableaux de tableaux de tableaux etc... sur le même principe

 
Encore une question, j'ai des fonctions qui doivent renvoyer plusieurs résultats. Comme ce n'est pas possible, j'ai dans ce cas
créé plusieurs variables globales, que les fonctions modifient au nécéssaire. C'est une bonne méthode ou ya mieux ?
 
LES VARIABLES GLOBALES : C'EST MAL/INTERDIT/SALE/INDEBUGGABLE
 
 
 
juju



Reply

Marsh Posté le 27-06-2002 à 16:28:06    

el_gringo a écrit a écrit :

 
 
Comment ça !?
T'as bien déja fait ça, g vu le 2, 3 trucs que t'as déja programmé, t'as déja affiché du texte ds un champ de texte, non !?
ds une list box, sous C++ Builder, y doit falloir utiliser un TListBox (je sais pas, moi j'utilise VC++, ms bon, j'imagine que c ça.
Et comme membre de ta TListBox, tu dois avoir un AddString, ou qqeu comme ça !
 




 
OK mais c'est de type AnsiString, et dans ce cas le '\n' ne représente rien d'autre qu'un caractère du style '|' en gras, mais pas un saut de ligne !
Mais je peux me débrouiller, je voulais juste savoir si il existe pas une solution propre !


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 27-06-2002 à 16:30:12    

juju_le_barbare a écrit a écrit :

 
 
OK mais c'est de type AnsiString, et dans ce cas le '\n' ne représente rien d'autre qu'un caractère du style '|' en gras, mais pas un saut de ligne !
Mais je peux me débrouiller, je voulais juste savoir si il existe pas une solution propre !




 
C'est juste à l'affichage que ça foire.
Et encore, ça dépend dans quoi tu l'affiches (genre TEdit qui supporte pas les retour de ligne)
Rien à voir avec le fait que ce soit une AnsiString.
cf la méthode que j'ai donné plus haut.


Message édité par antp le 27-06-2002 à 16:30:40

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-06-2002 à 16:30:12   

Reply

Marsh Posté le 27-06-2002 à 16:46:23    

juju_le_barbare a écrit a écrit :

 
 
OK mais c'est de type AnsiString, et dans ce cas le '\n' ne représente rien d'autre qu'un caractère du style '|' en gras, mais pas un saut de ligne !
Mais je peux me débrouiller, je voulais juste savoir si il existe pas une solution propre !




 
Et au passage, sous windows, le retour à la ligne, c'est pas \n, mais \r\n

Reply

Marsh Posté le 27-06-2002 à 16:53:44    

juju_le_barbare a écrit a écrit :

 
Encore une question, j'ai des fonctions qui doivent renvoyer plusieurs résultats. Comme ce n'est pas possible, j'ai dans ce cas
créé plusieurs variables globales, que les fonctions modifient au nécéssaire. C'est une bonne méthode ou ya mieux ?




Ce que je fais, c'est passer les variables par adresse (ie: pointeur) si les types de données sont complexes (tableau, structure, etc...) ou si les variables doivent être modifiées par la procédure appelée.  
Sinon, j'utilise un passage par valeur.
 
PS: Et je confirme, les variables globales, c'est bad :kaola:


Message édité par kizkoool le 27-06-2002 à 16:55:48
Reply

Marsh Posté le 27-06-2002 à 16:55:42    

kizkoool a écrit a écrit :

 
Ce que je fais, c'est passer les variables par adresse (ie: pointeur) si les types de données sont complexes (tableau, structure, etc...) ou si les variables doivent être modifiées par la procédure appelée.  
Sinon, j'utilise un passage par valeur.




 
merci à vous tous. Par contre '\n' marche très bien pas besoin du retour chariot '\r' ...
 
@++


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 27-06-2002 à 17:06:30    

juju_le_barbare a écrit a écrit :

 
 
merci à vous tous. Par contre '\n' marche très bien pas besoin du retour chariot '\r' ...
 
@++




 
...ça dépend des contrôles que t'utilises.
ça coute rien et c plus sur de le mettre !

Reply

Marsh Posté le 27-06-2002 à 18:20:07    

el_gringo a écrit a écrit :

 
 
...ça dépend des contrôles que t'utilises.
ça coute rien et c plus sur de le mettre !



:jap:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed