Suppression espaces en plus

Suppression espaces en plus - C - Programmation

Marsh Posté le 13-06-2009 à 12:53:20    

Bonjour,
voila un code que j'ai trouvé mais dont je ne comprend pas trop la manière dont il s'exécute :
 

Code :
  1. void DelSpace(char *source, char *dest)
  2. {
  3. char i,flag=1,p=0;
  4. for  (i=0 ; i < strlen(source); i++) {
  5.  if (source[i] != ' ' && source[i] != '\t') flag = 0;
  6.  if (flag == 0) { dest[p] = source[i]; p++; }
  7.  if (source[i] == ' ' || source[i] == '\t') flag = 1;
  8.  }
  9. dest[p]='\0';
  10. }


 
Je l'ai amélioré un peu ... le problème c'est que ce n'est pas clair qu'il va laisser maximum un seul espace, on a l'impression qu'il va supprimer tous les espaces, j'ai reécrit le code sous cette forme, pensant que ça ferait la même chose :

Code :
  1. for  (i=0 ; i < strlen(source); i++)
  2. {
  3. if (source[i] != ' ' && source[i] != '\t')
  4. { dest[p] = source[i]; p++; }
  5. }


Mais ce n'était pas ça, le mien supprimait tous les espaces, pourriez vous m'aider à mieux comprendre ce bout de code ? j'ai beau essayé de faire des shémas sur papier, mais le résultat que j'attendais était celui de mon deuxième code.
Merci d'avance !

Reply

Marsh Posté le 13-06-2009 à 12:53:20   

Reply

Marsh Posté le 13-06-2009 à 14:13:07    

Nethacker a écrit :

Mais ce n'était pas ça, le mien supprimait tous les espaces, pourriez vous m'aider à mieux comprendre ce bout de code ? j'ai beau essayé de faire des shémas sur papier, mais le résultat que j'attendais était celui de mon deuxième code.


N'essaye pas de copier le code des autres. Essaye plutôt d'écrire le tien...

 

Tu cherches à supprimer les espaces (' ') ou les 'blancs' (' ', '\t', '\n', '\r' etc.)

 

Pour les espaces :


len := strlen(chaine)
j := 0
FOR i = 0 TO len - 1 STEP 1
  IF chaine[i] <> ' '
     chaine[j] := chaine[i]
     INC j
  ENDIF
NEXT i
chaine[j] := 0


Je te laisse coder ça en C.


Message édité par Emmanuel Delahaye le 13-06-2009 à 14:14:48

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 13-06-2009 à 16:53:18    

Sinon pour comprendre un code obscure de quelqu'un d'autre, rien de tel qu'un déboggeur (GDB par exemple), même s'il n'y a rien à débugger ;) C'est beaucoup plus pratique que de rajouter plein de printf dans le code, ou d'essayer de comprendre par écrit.

Reply

Marsh Posté le 13-06-2009 à 18:09:21    

Ya aussi le debbuger "brain" très utilisé aussi.

Reply

Marsh Posté le 13-06-2009 à 21:35:28    

gdb, oui mais je connais pas trop les commandes, je devrais m'y mettre à fond, et oui souvent j'ajoute des printf pour voir où ce qu'il en est ...
 
pour ce qui est du code, vous avez bien raison, je ne dois pas voir le code des autres, mais j'ai bien essayer, mais ça n'a aboutit à rien, un deuxième indice était indispensable biensur, sinon je voulais supprimer les espaces et les tabulations seulement,et merci pour ton code, je connais le Delphi(Pascal) plus que le C ...

Reply

Marsh Posté le 13-06-2009 à 21:56:05    

Nethacker a écrit :

pour ce qui est du code, vous avez bien raison, je ne dois pas voir le code des autres, mais j'ai bien essayer, mais ça n'a aboutit à rien, un deuxième indice était indispensable biensur, sinon je voulais supprimer les espaces et les tabulations seulement,et merci pour ton code, je connais le Delphi(Pascal) plus que le C ...

Voilà ce que tu peux faire pour ne garder qu'un seul espace s'il y a une suite d'espaces:
etat est l'état de l'automate
0 : on n'a pas lu d'espace ==> on écrit le caractère courant
1 : on a lu un espace ==>  on n'en écrit pas d'autres
 
La fonction espace(caractère) renvoie 1 si l'argument est un espace, 0 sinon

Code :
  1. len <- longueur(chaine)
  2. j <- 0
  3. etat <- 1  // permet de ne pas écrire les espaces en début de chaine
  4. Pour i de 0 à len - 1 par pas de 1 faire
  5.   c <- espace(chaine[i])
  6.   si c = 0 alors
  7.     etat <- 0
  8.     chaine[j] <- chaine[i]
  9.     j <- j+1
  10.   sinon
  11.   si  etat = 0 alors
  12.     // ici on vient de lire le premier espace, on l'écrit  
  13.     // mais on mémorise le fait qu'on en a déjà écrit 1
  14.     chaine[j] := chaine[i]
  15.     j <- j+1
  16.     etat <- 1
  17.   fin si
  18. suivant i
  19. chaine[j] := 0


 
Une manière plus courte d'écrire ce code est

Code :
  1. len <- longueur(chaine)
  2. j <- 0
  3. etat <- 1  //permet de ne pas écrire les espaces en début de chaine)
  4. Pour i de 0 à len - 1 par pas de 1 faire
  5.   c <- espace(chaine[i])
  6.   // si le caractère courant n'est pas un espace
  7.   // ou si c'est le premier espace qu'on écrit
  8.   si c = 0  ou etat = 0 alors
  9.     chaine[j] <- chaine[i]
  10.     j <- j+1
  11.   fin si
  12.   // le nouvel etat correspond au caractère lu
  13.   etat <- c
  14. suivant i
  15. chaine[j] := 0


Reply

Sujets relatifs:

Leave a Replay

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