[C] Dépassement de tableau

Dépassement de tableau [C] - C++ - Programmation

Marsh Posté le 09-11-2002 à 13:48:23    

en fait j'aimerais savoir si je suis dans une chaine de caractère ou si au contraire je dépasse
ex:
a = "abc";
a[0] <- je suis dedans
a[300] <- je suis dehors (bien même... :))
 
parceque a[300] me renvoie forcément n'importe quoi puisqu'il va piocher çà dans la mémoire, or je voudrais qu'il me renvoie 0 le petit, histoire de l'utiliser comme booleen  :D  
 
donc je voudrais savoir, s'il vous plait, comment faire pour déterminer si je suis dans la chaine ou pas...  :jap:  
 
Ce que je fais avec: pas nécessaire de le lire
 
voilà, je travaille en ce moment sur des gros fichiers et j'aimerais optimiser mon strlen et donc raccourcir mon temps de calcul
 
j'ai donc fait une fonction my_strlen qui prend en 2ème argument un entier qui va correspondre à l'incrémentation de ma longueur
 

Code :
  1. int my_strlen(char *str, int n)
  2. {
  3.   int len;
  4.   puts("strlen optimise" );
  5.   for (len = 0; str[len]; len += n) // sauf que là ca déconne
  6.      ;
  7.   for (len -= n; str[len]; len++)
  8.      ;
  9.   return len;
  10. }


 
ex avec une incrémentation de 3 en 3
 
a="abcdefg";
 
a[0] dedans len = 0
a[3] dedans len = 3
a[6] dedans len = 6
a[9] dehors len = 9  <-- résultat du strlen à la louche
 
puis ensuite on enleve 3 à 9 puisque on a dépassé dans la dernière incrémentation
et la on va de 1 en 1 pour avoir la bonne taille
 
a[6] dedans len = 6
a[7] dehors len = 7
resultat -> 7  
 
sur une chaine de 7 cararctères c'est con, mais sur une chaine de 700000, ca aide bien  :love:  

Reply

Marsh Posté le 09-11-2002 à 13:48:23   

Reply

Marsh Posté le 09-11-2002 à 13:50:12    

réponse courte : tu peux pas  [:sinclaire]

Reply

Marsh Posté le 09-11-2002 à 13:51:43    

:) cool !
 
y'a meme pas un truc qui permet de voir si t'es dans une chaine allouée ou dans le 'cyberspace (ca tue comme mot)' ?

Reply

Marsh Posté le 09-11-2002 à 13:54:25    

Non. Tu crois vraiment que si c'était possible y'aurait autant de buffer overflow ?

Reply

Marsh Posté le 09-11-2002 à 13:55:15    

en C, une chaine c'est une suite d'octet terminée par un \0.  
donc si tu lis 3 par 3, t'as une chance sur 3 de louper la terminaison et de te retrouver dans les choux.

Reply

Marsh Posté le 09-11-2002 à 13:58:32    

oué c sur  :cry:
 
ptin c dommage, maintenant j'ai plus qu'a pleurer en parcourant de 1 en 1 ma chaine de 1000000 de caractères pour connaitre sa taille
 
cpa grave je dois pas perdre énormément de temps...mais bon...
 
ben merci beaucoup  ;)

Reply

Marsh Posté le 09-11-2002 à 14:02:00    

eventuellement si tu connais a peu pres la taille de la chaine, tu peux commencer a parcourir 1 a 1 apres un certain nombre de caractères, mais je te le conseilles vraiment pas, trop dangereux.
 
sinon si tu manipules la chaine qu'avec des fonctions a toi, tu peux la mettre dans une structure avec un entier qui indique sa taille et que tu mets a jour a chaque modif, mais bon.

Reply

Marsh Posté le 09-11-2002 à 14:08:57    

nan là c'est juste une chaine dont je ne connais pas la taille qu'on m'envoie sur stdin...donc  :pfff:  
 
tanpis...

Reply

Marsh Posté le 10-11-2002 à 01:28:56    

Citation :

c'est juste une chaine dont je ne connais pas la taille qu'on m'envoie sur stdin

Je suppose que tu la reçois dans un buffer.
Tu peut mettre ce buffer à 0 auparavant, ou 1 octet chaque n seulement.
Une recherche binaire te donnerai la taille, ou une estimation.


Message édité par Musaran le 11-11-2002 à 03:56:30

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 10-11-2002 à 01:42:17    

Ou alors, faut que tu fasses en sorte d'avoir plusieurs \0 à la fin de chaque chaîne que tu traites.
Si tu lis 1 caractère sur 3, tu peux t'en sortir en finissant toutes tes chaînes par \0\0\0 :)

Reply

Sujets relatifs:

Leave a Replay

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