fonction strlen calcule de la longueur de chaine

fonction strlen calcule de la longueur de chaine - C - Programmation

Marsh Posté le 31-03-2010 à 21:24:42    

Bonjour :D
 
Voila sur le tuto des chaines de caractères il y a cette fonction pour calculer la longueur d'une chaine..
 
Voici le code :
 

Code :
  1. int longueurChaine(const char* chaine)
  2. {
  3.     int nombreDeCaracteres = 0;
  4.     char caractereActuel = 0;
  5.     do
  6.     {
  7.         caractereActuel = chaine[nombreDeCaracteres];
  8.         nombreDeCaracteres++;
  9.     }
  10.     while(caractereActuel != '\0');
  11.     nombreDeCaracteres--;
  12.     return nombreDeCaracteres;
  13. }


 
Donc je voulais modifier ce code pour utiliser une boucle for mais cela fonctionne pas.. :( ou se trouve le problème?)
 
Voici le code modifié :

Code :
  1. int longueurChaine(const char* chaine)
  2. {
  3.     int i;
  4.     char caractereActuel = 0;
  5.    for ( i = 0; caractereActuel != '\0'; i++)
  6. {
  7.      caractereActuel = chaine[i];
  8. }
  9.      return i--;
  10. }

Reply

Marsh Posté le 31-03-2010 à 21:24:42   

Reply

Marsh Posté le 31-03-2010 à 21:59:12    

Très simple, ta condition de terminaison du for est que caractereActuel soit égale à 0. Or , tu l'initialises à 0 juste avant. Par conséquent, ta boucle for ne se fait pas.
 
Avec un debugger , tu aurais pu voir ça très facilement.
 
 
Attention par ailleurs, que se passe-t-il si la chaine que tu passes ne contient jamais de caractère '0' , la valeur renvoyée sera incohérente.
 
 

Reply

Marsh Posté le 31-03-2010 à 22:16:34    

Merci a toi..
 
Et comment corrigé ce code?  
 
Comment faire pour debugger car quand je clique sur ce bouttom rien ne se passe.. j'ai code::block

Reply

Marsh Posté le 01-04-2010 à 11:24:49    

Il te suffit d'initialiser ta variable caractereActuel à une valeur différente de la condition de terminaison , c'est à dire différente de 0.
 
La différence entre le précédent algorithme et le tien, c'est que dans le premier, la boucle est faite au moins une fois avant de tester la condition de sortie (principe du do-while) , alors que dans le tien, la condition est testée dès le départ de la boucle.
 
 
Pour le debugger, il faut que tu mettes des points d'arrêts (ou breakpoint) sur les lignes sur lesquelles tu souhaites que le debugger s'arrête, pour ensuite exécuter pas à pas les instructions de ton programme.

Reply

Marsh Posté le 01-04-2010 à 12:42:47    

Je me demande si cela ne ferait pas l'affaire aussi:

Code :
  1. int longueurChaine(const char* chaine)
  2. {
  3.     int i;
  4.    for ( i = 0; chaine[i] != '\0'; i++)
  5.       ; 
  6.    return i;
  7. }

Reply

Marsh Posté le 01-04-2010 à 16:34:23    

Merci a tous c'est ok! tout rentre dans l'ordre... .)
 
Une autre question :
 
Le i++ dans for(i = 0; i < taille; i++) s'incrémente si la condition est vrai ou elle s'incrémente après les instructions (c'est a dire a la fin de la boucle) ?

Reply

Marsh Posté le 01-04-2010 à 17:36:56    

Si tu réfléchis bien, "à la fin de la boucle" suppose que l'on y soit entrée parce que la condition était vrai...

Reply

Marsh Posté le 01-04-2010 à 17:50:52    

Merci

Reply

Marsh Posté le 01-04-2010 à 20:04:20    

lassault1 a écrit :

Merci a tous c'est ok! tout rentre dans l'ordre... .)
 
Une autre question :
 
Le i++ dans for(i = 0; i < taille; i++) s'incrémente si la condition est vrai ou elle s'incrémente après les instructions (c'est a dire a la fin de la boucle) ?


 
 
tu peux imaginer le for de la façon suivante :  
 
 
for (X;Y;Z)  
{
T
}
 
équivaut à :
 
X
while (Y)
{
T
Z
}
 
Par exemple :  
 

Code :
  1. int i;
  2. int a = 0;
  3. for (i = 0 ; i < 10 ; i++)  // X;Y;Z
  4. {
  5. a = a+2;  // T
  6. }


 
équivaut à  
 
 

Code :
  1. int i;
  2. int a = 0;
  3. i = 0; // X = initialisation de boucle
  4. while (i < 10) // Y  = condition de sortie
  5. {
  6. a = a+2; // T = ton code
  7. i++; // Z = code de fin de boucle
  8. }


 


Message édité par xilebo le 01-04-2010 à 20:08:57
Reply

Sujets relatifs:

Leave a Replay

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