1 utilisateur anonyme et 12 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

chaine de caracteres en C

n°5999
aceditnana​r
Chabadabada...
Posté le 04-08-2005 à 21:03:13  profilanswer
 

Salut tlm...
 
Alors un petit doute me submerge..
je fait un prg en c et je voudrai avoir plusieurs chaines de caracteres dans differentes variable. Donc :  
char txt[25]="bonjour"; ca mon compilo veut bien mias par exemple si je fais  
char txt[25]; txt="bonjour"; y veut rien faire et me fais une erreur.. est se que c'est normal? il me semble que non.. mais bon...


Message édité par aceditnanar le 04-08-2005 à 21:03:42

---------------
"S'il fallait construire des asiles pour les cons, vous imaginez la taille des batiments?..." A.Dussolier' Tais toi!!!'
http://perso.wanadoo.Fr/mantares
mood
Google
Posté le 04-08-2005 à 21:03:13  profilanswer
 

n°6000
Deather2
OpenBSD: the way to go!
Posté le 04-08-2005 à 21:16:02  profilanswer
 

Oui, c'est normal.
Exemple concret qui marche:

Code :
  1. char Chaine[]="Chaine1";
  2. char *pChaine;
  3. pChaine = "Chaine2";


 
Ca ca marche ;)
Note que si tu mets pas de valeur entre les [], il prendra la taille de la chaine assignee.

n°6001
aceditnana​r
Chabadabada...
Posté le 04-08-2005 à 21:28:49  profilanswer
 

et qd je veux une chaine de caractere que je veux faire changer au milieu de mon prg.. je suis obligé de repasser par le pointeur? ou y'a une autre soluce?
 
edit : marche pas.. y me dit qd je redefini la chaine de caractere "bad expression syntax" et me surligne le " ...


Message édité par aceditnanar le 04-08-2005 à 21:40:05

---------------
"S'il fallait construire des asiles pour les cons, vous imaginez la taille des batiments?..." A.Dussolier' Tais toi!!!'
http://perso.wanadoo.Fr/mantares
n°6002
Deather2
OpenBSD: the way to go!
Posté le 04-08-2005 à 21:45:29  profilanswer
 

Utilise strncpy() :
char chaine[50];
strncpy(chaine, "blablabla", 50);

n°6003
Deadog
Dain Bramaged
Posté le 04-08-2005 à 23:12:24  profilanswer
 

Deather2 a écrit :


Code :
  1. char *pChaine;
  2. pChaine = "Chaine2";




 
 
 :heink:  :heink:  :heink:  :heink:  
 
ça, ça marche pê sur un compilo de merde ou un compilo sans restriction, mais c'est surtout pas une habitude à prendre :non:  
 
 
de toute façon ça a pas l'air de marcher pour lui [:grut]
 
une chaine de caract, quand tu la définie comme ça
char *txt;
ou comme ça :
char txt[];
ou comme ça :
char txt[25];
 
ça reviens à peu près au même lors de son utilisation : ça s'utilise comme un pointeur
la seul différence c'est la manière dont elle est alloué, stout
 
tu ne peux pas faire txt="machaine" en plus milieu de ton programme
tu peux le faire uniquement lors de sa définition
 
si tu as définie un "char *txt;" ou "char txt[];", alors tu n'as rien alloué, tu as juste un pointeur sur une donné au hasard
dans ce cas, il faut utiliser strdup ou strndup
sans oublié de libérer la mémoire (free) si tu refais la rechange à nouveau par un str(n)dup
 
si tu as fait "char *txt="mon texte";" ou "char txt[]="mon texte";", la tu as alloué qqlch, qqlch que tu que tu n'as pas le droit de désallouer (avec free) et qqlch dont tu ne peux changer la taille.
tu le modifie avec strcpy en faisant gaffe à nepas dépasser la taille initiale
l'utilisation de strncpy est plus compliqué (j'explique après)
 
si tu as fait "char txt[50]="mon texte";", c pareil qu'avant, juste que sa taille initiale sera de 50 (avec le 0) et non la taille de "mon texte"+1
 
 
pour strncpy, il faut y faire très attention :o
par expl, l'expl de deather avec strncpy est faux :p
 
strncpy ne met pas le 0 final si dans la chaine source il ne se trouve pas (quand on veux tronquer une chaine par expl)
 
on l'utilise ainsi :
char chaine[50];
strncpy(chaine, "blabla", 49);
chaine[49] = 0;
 
et pas autrement
 
 
n'hésite pas à reposé des questions, la compréhension des chaine de caractères et les fonctions qui les exploite n'est pas facile en C ^^

n°6004
Deather2
OpenBSD: the way to go!
Posté le 04-08-2005 à 23:52:18  profilanswer
 

Mon code immonde compile sous GCC avec -ansi et -pedantic :p mais c'est clair qu'il ne faut pas utiliser ca.
 
L'explication de Deadog est tres bonne.
 

Citation :

strncpy ne met pas le 0 final si dans la chaine source il ne se trouve pas (quand on veux tronquer une chaine par expl)


Argh! Tu viens de m'apprendre qqch d'important que j'ignorais. Merci.


Message édité par Deather2 le 04-08-2005 à 23:52:59
n°6005
nicodache
marmotte en chocolat concept ©
Posté le 04-08-2005 à 23:52:43  profilanswer
 

et -Wall aussi ?


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°6006
Deather2
OpenBSD: the way to go!
Posté le 04-08-2005 à 23:53:23  profilanswer
 

-Wall ne me donne aucun warnings :/

n°6007
nicodache
marmotte en chocolat concept ©
Posté le 04-08-2005 à 23:56:27  profilanswer
 

bein c'est encore mieux alors :D


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°6008
aceditnana​r
Chabadabada...
Posté le 05-08-2005 à 00:06:11  profilanswer
 

-wall????


---------------
"S'il fallait construire des asiles pour les cons, vous imaginez la taille des batiments?..." A.Dussolier' Tais toi!!!'
http://perso.wanadoo.Fr/mantares
n°6009
Deather2
OpenBSD: the way to go!
Posté le 05-08-2005 à 00:22:08  profilanswer
 

C'est une option pour le compilateur GCC qui lui dit d'afficher tout les warnings.


Message édité par Deather2 le 05-08-2005 à 00:23:07
n°6010
Deadog
Dain Bramaged
Posté le 05-08-2005 à 00:32:33  profilanswer
 

Deather2 a écrit :

Mon code immonde compile sous GCC avec -ansi et -pedantic :p mais c'est clair qu'il ne faut pas utiliser ca.


 
sans doute pke gcc est intelligent est qu'il à remit ça comme il se doit [:666 ]  

n°6013
KnX
To be or not to code.
Posté le 06-08-2005 à 12:09:39  profilanswer
 

Théoriquement, tant que tu l'assigne juste comme ca ca va, si tu t'amuses a vouloir modifier le string, tu tombe dans un UB :/ ( rapport à ce que ce genre de string est censé être dans une zone readonly )


Message édité par KnX le 06-08-2005 à 12:10:26
n°6014
Deadog
Dain Bramaged
Posté le 06-08-2005 à 13:41:11  profilanswer
 

un UB ?
 
la zone n'est pas readonly, tu peux la modifier ;)


Message édité par Deadog le 06-08-2005 à 13:41:27
n°6015
KnX
To be or not to code.
Posté le 06-08-2005 à 14:09:32  profilanswer
 

( Undefined Behaviour )
 
Bon jviens de relire le K&R en détail pour être précis :

Code :
  1. char Chaine[]="Chaine1";


Ici on initialise directement le tableau de char Chaine, et on le remplit caractère à caractère, il est légal de le modifier.

Code :
  1. char *pChaine;
  2. pChaine = "Chaine2";


Ici, on initialise un pointeur sur char, ensuite on fait pointer ce pointeur vers une Constante chaine ("Chaine2" ). Or les constantes chaines ont les propriétés suivante :
- si dans le code on retrouve 2x la même constante chaine, elles peuvent être le même endroit en mémoire ou non, ceci dépends de l'implémentation.  
- il est interdit de les modifier.
- elles sont concaténables ( "blahb""pwet" => "blahpwet" ).
 
La raison de l'interdiction de modifier est évidente au regarde de la 1ere propriété, imaginons que nous ayons :

Code :
  1. char *ptr1,*ptr2;
  2. /* On assigne a chaque pointeur une Constante chaine */
  3. ptr1="Coin";
  4. ptr2="Coin";
  5. /* On modifie la 2eme lettre de la chaine pointée par le ptr1...  */
  6. /* ptr1 pointe donc désormais vers la chaine : "Clin"             */
  7. /* ATTENTION !! C'est justement cette instruction qui ne serait   */
  8. /* possible qui si on avait le droit en écriture sur la constante */
  9. /* chaine "Coin" */
  10. ptr1[1] = 'l';
  11. /* C'est la que le problème arrive, on veut afficher la chaine pointée par ptr2 : */
  12. puts(ptr2);
  13. /* A votre avis, verra t'on affiché "Coin" ou "Clin" ? ...    */
  14. /* D'après la propriété n°1, cela dépends de l'implémentation */
  15. /* Je vous laisse au plaisir de débugger ce genre de choses :/*/


 
En résumé, le code de Deather2 marche, est standard, son comportement est définit, mais la moindre tentative de modification du ptr2, et PAF ca marche pas ... pas très pratique comme chaine, et peu propre :/

n°6016
Deadog
Dain Bramaged
Posté le 06-08-2005 à 14:40:51  profilanswer
 

les problèmes d'implémentations sont justement une grosse partie du mauvais code
et y'en a plein comme ça dans le C ...
 
edit :
c'est d'ailleur pour ça que des normalisations comme le C89/99, l'AINSI-C ou le POSIX existent, elles définissent des fonctions avec des comportement assurés, et qu'il est préférable de passer par ces fonctions que de bidouiller le langage


Message édité par Deadog le 06-08-2005 à 14:43:17
n°6018
KnX
To be or not to code.
Posté le 06-08-2005 à 15:13:26  profilanswer
 

Je ne peut que plussoyer avec véhémence ;)
 
 
 
Respectez les p*tain de standards, et pour ca, commencez par bien les connaitre ... ( ou ayez tout le temps au moins un K&R sous la main )

n°6020
Deadog
Dain Bramaged
Posté le 06-08-2005 à 16:51:43  profilanswer
 

enfin bon, on s'est éloigné du sujet la :whistle:
 
acid > pour les chaine de caract, utilise à fond les fonctions de string.h ;)

n°6021
aceditnana​r
Chabadabada...
Posté le 06-08-2005 à 23:27:55  profilanswer
 

oki thks ;)


---------------
"S'il fallait construire des asiles pour les cons, vous imaginez la taille des batiments?..." A.Dussolier' Tais toi!!!'
http://perso.wanadoo.Fr/mantares
n°6022
Mossieur P​ropre
Posté le 08-08-2005 à 19:07:01  profilanswer
 

Deather2 a écrit :


Code :
  1. char *pChaine;
  2. pChaine = "Chaine2";


 
Note que si tu mets pas de valeur entre les [], il prendra la taille de la chaine assignee.


 
fouyayayayayayayayayayayayayayaya http://forum.hardware.fr/images/perso/kwak.gif
 
EDIT > pluri-grillaide, ça va de soit, mais je tenais quand même à le dire. :o [:pak2kro:1]


Message édité par Mossieur Propre le 08-08-2005 à 19:07:45

---------------
Forever Yoko in my heart. | http://www.phoenixfr.org - réseau IRC francophone | knexos xstephx a dit : "blabla"
n°6023
aceditnana​r
Chabadabada...
Posté le 08-08-2005 à 19:57:04  profilanswer
 

un modo pour fermer le sujet? car je crois que tout a ete dis? non?  
 
merci


Message édité par aceditnanar le 08-08-2005 à 20:01:04

---------------
"S'il fallait construire des asiles pour les cons, vous imaginez la taille des batiments?..." A.Dussolier' Tais toi!!!'
http://perso.wanadoo.Fr/mantares
n°6024
Deadog
Dain Bramaged
Posté le 08-08-2005 à 22:22:39  profilanswer
 

pkoi fermer un sujet quand y'a plus rien à dire ? il coulera tout seul [:spamafote] (enfin, sauf si certains font des redites :D)

n°6025
KnX
To be or not to code.
Posté le 09-08-2005 à 00:38:40  profilanswer
 

Mossieur Propre a écrit :

fouyayayayayayayayayayayayayayaya http://forum.hardware.fr/images/perso/kwak.gif
 
EDIT > pluri-grillaide, ça va de soit, mais je tenais quand même à le dire. :o [:pak2kro:1]


 
Y'a des extrèmes cas ou ca peut se faire, m'enfin faut cadrer la chose et en comprendre les conséquences ...
( par exemple ca serait pas franchement dramatique pour un fallback sur la translation d'une gui ... )

n°6026
Deadog
Dain Bramaged
Posté le 09-08-2005 à 03:37:42  profilanswer
 

traduction [:maitre capello]
 
et les traductions se font par getext ou autre [:matleflou]

n°6027
KnX
To be or not to code.
Posté le 09-08-2005 à 13:44:16  profilanswer
 

d'ou le _fallback_ ( bha quoi, dans ce monde de brute, parfois gettext marche po [:matlefou] ) et heu ouais... pardon pour le franglais

mood
Google
Posté le 09-08-2005 à 13:44:16  profilanswer
 


Aller à :
Ajouter une réponse
 

Hit Parade