compréhension d'un petit code réécris issus de string.h

compréhension d'un petit code réécris issus de string.h - C - Programmation

Marsh Posté le 19-06-2010 à 14:14:08    

Bonjour je débute dans la programmation en C et là je fait quelque petit exercice j'essaye de ré écrire les fonctions de string.h
 
et j'ai une petit questions à vous posez pour ce code çi:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int longeurChaine(const char* chaine);
  4. int main(int argc, char* argv[])
  5. {
  6.     char chaine[] = "Salut";
  7.     int longeur = 0;
  8.     longeur = longeurChaine(chaine);
  9.     printf("la chaine '%s' comprend %d caracteres de long", chaine, longeur);
  10.     return 0;
  11. }
  12. int longeurChaine(const char* chaine)
  13. {
  14.     int caractereActuel = 0;
  15.     char nombreDeCaractere = 0;
  16.     do
  17.     {
  18.         caractereActuel = chaine[nombreDeCaractere];
  19.         nombreDeCaractere++;
  20.     }while(caractereActuel != '\0');
  21.     nombreDeCaractere--;
  22.     return nombreDeCaractere;
  23. }


je voudrais sa voir pour quoi dans la fonction 'longeurChaine' que je déclare ma variable nombreDeCaractere si je la met de type 'int' cela ne marche pas et je suis obligé de la mettre de type 'char'???

Reply

Marsh Posté le 19-06-2010 à 14:14:08   

Reply

Marsh Posté le 19-06-2010 à 14:47:46    

Chez moi, ça marche.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-06-2010 à 15:07:33    

Oui car dans ce code là nombreDeCaractere est de type 'char' essaye en le changeant en 'int' pour voir

Reply

Marsh Posté le 19-06-2010 à 15:31:49    

RESOLUS  
Merci

Reply

Marsh Posté le 19-06-2010 à 16:05:55    

jasinski13 a écrit :

Oui car dans ce code là nombreDeCaractere est de type 'char' essaye en le changeant en 'int' pour voir

Quand je disais que ça marchait, c'est avec le type de nombreDeCaractere mis à int, bien sur.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 18-09-2010 à 22:38:52    

Un exercice facile qui devrait être presque obligatoire pour tous les étudiants qui apprennent le C, et peut s'avérer extrêmement utile par la suite : écrire une lib safestring.h qui agit sur des structures
string { char *str; size_t len }:

 

0. coder une fonction stringset(string *str, char c) qui remplit *str avec le char c

 

1. coder stringcpy(string *dst, string *src) et stringcat(string *str1, string *str2) de sorte que la string de destination puisse en cas de nécessité se réallouer dynamiquement en fonction de la taille de la source (la taille allouée étant multipliée par le nombre d'or à chaque réallocation), et puis string * stringdup(string *str) qui duplique la string

 

2. coder la transformation de string en char* et vice versa, ainsi que stringcmp(string *str1, string *str2)

 

3. coder les fonctions stringchcpy(string *dst, char *src) et stringchcat(string *str1, char *str2), ainsi que la fonction de comparaison stringchcmp(string *str1, char *str2)

 

4. coder une fonction substring(string *str, string *sub, size_t idx1, size_t idx2) qui retourne une sous-chaine de la première

 

5. Outre la sécurité contre les risques d'écrasements mémoire, quels autres avantages apporte une telle lib ? Quelles précautions doit-on prendre en l'utilisant ?

 

6. refaire le même exercice, mais avec cette fois-ci des tableaux statiques dans la structure string, donc pas d'allocation et de réallocation dynamique, mais vérification systématique des tailles à l'exécution: Toutes les fonctions doivent vérifier que leurs arguments sont corrects, de sorte qu'aucun dépassement ne soit possible, et gérer ce cas d'erreur en retournant un code d'erreur.

 

7. dans quel cas une telle lib peut s'avérer nécessaire ?

 

Maintenant, on veut créer une lib portant sur une structure buffer {byte *buf, int sz}. La différence principale entre buffer et string, est que buffer ne contient pas de '\0' final dans *buf, et sa taille est fixe et déterminée une fois pour toutes.
Malgré la ressemblance, les opérations utilisées sur buffers d'octets sont en général assez différentes des opérations sur chaines de caractères.

 

8. coder une fonction bufferset(buffer *str, byte c) qui initialise *str avec le byte c

 

9. coder une fonction buffercpy(buffer *dst, buffer *src) et bufferchcpy(buffer *dst, char *src), ainsi que les fonctions de transformation string *buffertostring(buffer *buf) et buffer * stringtobuffer(string *str)

 

10. coder une fonction size_t shiftleft(buffer *str, size_t n, byte c) et size_t shiftright(buffer *str, size_t n, byte c) qui déplace le contenu du buffer de n places vers la gauche/droite, en comblant les octets libérés dans le buffer avec le byte c, et retourne le nbre d'octets libérés

 

Toutes les fonctions doivent vérifier que leurs arguments sont corrects, gérer d'éventuelles troncations, et retourner un code d'erreur dans ce cas.

 

Et enfin, en exercice bonus, coder une fonction capable de repérer les fuites mémoires: elle gardera dans une structure de type Hashmap (le codage de Hashmap ne fait pas partie de l'exercice) les adresses des string et buffers alloués en clefs, et les tailles allouées, le nom du fichier source et le numéro de ligne en valeur. La taille sera mise à jour à chaque réallocation suite à un appel à stringcpy, stringchcpy, stringcat, stringchcat, etc. Enfin, les couples clef-valeur seront supprimés à chaque désallocation. On pourra consulter à tout moment la liste des allocations.


Message édité par el muchacho le 10-10-2010 à 21:19:38

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Sujets relatifs:

Leave a Replay

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