Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1240 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°167411
juju_le_ba​rbare
Vous fiez pas aux apparences !
Posté le 27-06-2002 à 16:08:43  profilanswer
 

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
mood
Publicité
Posté le 27-06-2002 à 16:08:43  profilanswer
 

n°167414
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-06-2002 à 16:10:40  profilanswer
 

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
n°167418
evode
Meuaarf !! ReZo !!!
Posté le 27-06-2002 à 16:15:34  profilanswer
 

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 !!!
n°167420
El_gringo
Posté le 27-06-2002 à 16:17:27  profilanswer
 

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

n°167422
juju_le_ba​rbare
Vous fiez pas aux apparences !
Posté le 27-06-2002 à 16:18:26  profilanswer
 

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
n°167426
El_gringo
Posté le 27-06-2002 à 16:22:21  profilanswer
 

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 !

n°167428
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-06-2002 à 16:26:33  profilanswer
 

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
n°167430
smaragdus
whores, drugs & J.S. Bach
Posté le 27-06-2002 à 16:27:19  profilanswer
 

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



n°167432
juju_le_ba​rbare
Vous fiez pas aux apparences !
Posté le 27-06-2002 à 16:28:06  profilanswer
 

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
n°167434
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-06-2002 à 16:30:12  profilanswer
 

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
mood
Publicité
Posté le 27-06-2002 à 16:30:12  profilanswer
 

n°167464
El_gringo
Posté le 27-06-2002 à 16:46:23  profilanswer
 

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

n°167473
kizkoool
Posté le 27-06-2002 à 16:53:44  profilanswer
 

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
n°167479
juju_le_ba​rbare
Vous fiez pas aux apparences !
Posté le 27-06-2002 à 16:55:42  profilanswer
 

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
n°167495
El_gringo
Posté le 27-06-2002 à 17:06:30  profilanswer
 

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 !

n°167568
juju_le_ba​rbare
Vous fiez pas aux apparences !
Posté le 27-06-2002 à 18:20:07  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
[c] Comment convertir un entier en char ...cstring 2 char
[C] char** et &char*cstring, char, mfc
recupération des n premiers caracteres d'une variableComment mettre la 1ere lettre d'une chaine de caractères en majuscule
Decouper une chaine de char en Php[C] problème de lecture de caractères dans un fichier
mySQL : CHAR ou VARCHARComparer 2 chaines de caractères en JSP ?
Plus de sujets relatifs à : [c++] chaînes de caractères (char *)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR