[C / GNU] petit doute sur strncpy

petit doute sur strncpy [C / GNU] - C - Programmation

Marsh Posté le 17-07-2003 à 01:59:18    

après plusieurs segfault bizarre je viens de lire ça dans la page man de strncpy :
 
La fonction strncpy() est identique, sauf que seuls les n premiers octets de src sont copiés. Ainsi, s'il n'y a pas de caractère nul dans les n premiers octets de src, la chaîne résultante ne disposera de caractère nul final.
 
:/
 
dans mon cas j'avais une zone mémoire alloué de 2 octets :
strncpy(buf, "q", 1);
(je précise ke la je vous met des arguments fixe mais en vrai c dynamique :D ;))
et j'me retrouvais avec une chaîne buf comme ça :
q(8HXhx" ,EOè...
'fin bref, en chaîne de caractères ki n'avait visiblement pas de \0 à la fin (après le "q" ici);
 
j'suis obligé de mettre buf[strlen("q" )] = 0; après mon strncpy ? ça me parrait louche pke j'en ai jamais entendu parler :heink:


Message édité par Deadog le 17-07-2003 à 02:00:00
Reply

Marsh Posté le 17-07-2003 à 01:59:18   

Reply

Marsh Posté le 17-07-2003 à 02:38:04    

1) si tu veux copié un seul caractère, pas la peine de faire aec strncpy
2) c'est bien tenté avec strlen, le problème c'est que strlen recehrche cet '\0' final. donc la solution
 

Code :
  1. char *dest, *src;
  2. size_t n;
  3. // ....
  4. strncpy(dest, src, n);
  5. dest[n]='\0';


evidemment, il faut quand meme tenir compte de la taille de l'espace alloué pour dest. et voilà. si tu veux améliorer ta détection d'erreur (apparement tes segfaults apparaissaient quand ça leur plaisaient, ce qui est normal puisqu' on peut tres bousille des tonnes de trucs sans faire d'erreur de segmentation), je te conseille, l'emploi de efence

Reply

Marsh Posté le 17-07-2003 à 03:45:37    

1-c'est un cas particulié ke j'ai présenté ici, dans mon prog ça copie bcp plus de caract ;)
 
2-bah en faite, dans mon cas voici comment g fait :

Code :
  1. strncpy(buf, token, max_lexem_len);
  2. buf[strlen(token)] = 0;


donc je me faisait pas avoir avec le strlen ;)
 
merci pour efence, je vais voir ça demain :jap:


Message édité par Deadog le 17-07-2003 à 03:46:14
Reply

Marsh Posté le 17-07-2003 à 08:15:37    

deadog a écrit :


2-bah en faite, dans mon cas voici comment g fait :

Code :
  1. strncpy(buf, token, max_lexem_len);
  2. buf[strlen(token)] = 0;


 


tu te fais avoir avec le strlen il me semble.
si token = "qwertyuiop";
et que tu fais strncpy(buf,token,3);
puis buf[strlen(token)] = 0;  
tu vas te retrouver avec buf = "qwe???????0"  ;)


Message édité par polo021 le 17-07-2003 à 08:16:30
Reply

Marsh Posté le 17-07-2003 à 14:15:32    

non pke max_lexem_len a une valeur maximal ne pouvant pas dépasser ce ke je lui fait copié ;)

Reply

Marsh Posté le 17-07-2003 à 14:22:58    

deadog a écrit :

non pke max_lexem_len a une valeur maximal ne pouvant pas dépasser ce ke je lui fait copié ;)


 
Ouais enfin c'est quand même plus propre d'utiliser max_lexem_len, ça fait un appel de fonction en moins et c'est plus sûr au cas où tu modifies un truc :D


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

Marsh Posté le 17-07-2003 à 14:32:08    

oui, c'est pas faux ça :D ;)

Reply

Marsh Posté le 17-07-2003 à 15:03:57    

polo021 a écrit :


tu te fais avoir avec le strlen il me semble.

et tu lis le topic avant de répondre des fois?

Reply

Marsh Posté le 17-07-2003 à 15:06:40    

++Taz a écrit :

et tu lis le topic avant de répondre des fois?


qu'est ce qui n'est pas a ton gout encore? :o

Reply

Marsh Posté le 17-07-2003 à 15:17:31    

ben que tu lis pas le post avec de répondre

Reply

Sujets relatifs:

Leave a Replay

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