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

  FORUM HardWare.fr
  Programmation
  C++

  [C] Dépassement de tableau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Dépassement de tableau

n°242185
M@xx
le lagomorphe
Posté le 09-11-2002 à 13:48:23  profilanswer
 

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:  

mood
Publicité
Posté le 09-11-2002 à 13:48:23  profilanswer
 

n°242188
lorill
Posté le 09-11-2002 à 13:50:12  profilanswer
 

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

n°242189
M@xx
le lagomorphe
Posté le 09-11-2002 à 13:51:43  profilanswer
 

:) 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)' ?

n°242191
lorill
Posté le 09-11-2002 à 13:54:25  profilanswer
 

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

n°242192
lorill
Posté le 09-11-2002 à 13:55:15  profilanswer
 

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.

n°242197
M@xx
le lagomorphe
Posté le 09-11-2002 à 13:58:32  profilanswer
 

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  ;)

n°242201
lorill
Posté le 09-11-2002 à 14:02:00  profilanswer
 

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.

n°242207
M@xx
le lagomorphe
Posté le 09-11-2002 à 14:08:57  profilanswer
 

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

n°242435
Musaran
Cerveaulté
Posté le 10-11-2002 à 01:28:56  profilanswer
 

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
n°242440
mrbebert
Posté le 10-11-2002 à 01:42:17  profilanswer
 

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 :)


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

  [C] Dépassement de tableau

 

Sujets relatifs
Stockage de lignes d'un fichier dans un tableauUn roll over sur un fond de cellule de tableau W3C machin ;)
Pb de tableau de type Filestruct tableau ds 1 fonction ...
stocker des info ds tableauOccurrences de caracteres dans un tableau .....
[ JS ] générer un nombre aléatoire et probleme de tableau ( var )Trier un tableau a DEUX dimensions !
[VB6]Grille/tableau[VB6]TabStrip / Pb avec tableau multi-dimensionnel
Plus de sujets relatifs à : [C] Dépassement de tableau


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