programme débutant sur les chaînes.

programme débutant sur les chaînes. - C - Programmation

Marsh Posté le 16-06-2010 à 03:12:07    

Plop,
 
bon j'ai décidé d'apprendre un language fait piur les hommes, les vrais  :o  
alors j'ai acheté le "Language C" des 2 barbus,  
 
je suis au chapitre 1 et j'essaie de faire des petites trucs tous cons avant de poursuivre mais je bloque déja :-(
 

Code :
  1. #include <stdio.h>
  2. #define IN       1
  3. #define OUT      0                                                                           
  4. #define MAXCHARS 1000
  5. int recv(char s[])
  6. {
  7.     int i;
  8.     for (i = 0; (s[i] = getchar()) != EOF; ++i)
  9.         ;;
  10.     s[i] = '\0';
  11.     return i;
  12. }
  13. int length(char s[])
  14. {
  15.     int i;
  16.     for (i = 0; s[i] != '\0'; ++i)
  17.         ;;
  18.     return i;
  19. }
  20. void reverse(char s[])
  21. {
  22.     int i = 0;
  23.     int len = length(s) - 1;
  24.     char ss[MAXCHARS];
  25.     /* copy s to ss */
  26.     while ((ss[i] = s[i]) != '\0')
  27.         ++i;
  28.    
  29.     for (i = 0; i <= len; ++i)
  30.         s[i] = ss[len-i];
  31. }
  32.    
  33. void lstrip(char s[])
  34. {
  35.     int i = 0;
  36.     int j = 0;
  37.     int where = OUT;
  38.     char ss[MAXCHARS];
  39.    
  40.     while ((ss[i] = s[i]) != '\0')
  41.         ++i;
  42.     for (i = 0; ss[i] != '\0'; ++i) {
  43.         if ((ss[i] == ' ') && (where == OUT))
  44.             continue;
  45.         where = IN;
  46.         s[j] = ss[i];
  47.         ++j;
  48.     }
  49.     s[j] = '\0';
  50. }
  51. void rstrip(char s[])
  52. {
  53.     printf("%d", length(s));
  54.     reverse(s);
  55.     printf("%d", length(s));
  56.     lstrip(s);
  57.     printf("%d", length(s));
  58.     reverse(s);
  59. }
  60. int main(void)
  61. {
  62.     char s[MAXCHARS];
  63.    
  64.     recv(s);
  65.     rstrip(s);
  66.     return 0;
  67. }


les printf dans la fonction rstrip() devraient me renvoyer des valeurs différentes si la valeur de la chaîne entrée contient des espaces à la fin
"lalala     "
 
mais j'obtiens toujours le même nombre de caractères, pourtant quand j'utilise reverse() tout seul ca marche, idem pour lstrip()  
une idée? ca fait une heure je suis dessus  [:ddr555]  
 

Reply

Marsh Posté le 16-06-2010 à 03:12:07   

Reply

Marsh Posté le 16-06-2010 à 04:53:15    

ok j'ai compris..
c'était les retours chariot "lala    \n" qui foutaient la merde,
donc j'ai modifié lstrip()

Code :
  1. if ((ss[i] == ' ' || ss[i] == '\n') && (where == OUT))

Reply

Marsh Posté le 18-06-2010 à 19:38:53    


 
Mouais. On voit le type qui n'a jamais fait de COBOL !!! :kaola:
 
 
 

Code :
  1. int length(char s[])
  2. {
  3.     return strlen(s);
  4. }


 
 
     

Code :
  1. void reverse(char s[])
  2. {
  3.     int i,j;
  4.     for (i=0, j=length(s) - 1; i < j; i++, j--)
  5.     {
  6.          s[i]=s[i]^s[j];
  7.          s[j]=s[i]^s[j];
  8.          s[i]=s[i]^s[j];
  9.      }
  10. }


 
 
 

Code :
  1. void lstrip(char s[])
  2. {
  3.     int reel, copie=0;
  4.     int len = length(s) - 1;
  5.     for (reel=0; isspace(s[reel]) && s[reel] != '\0'; reel++);
  6.     for (copie=0; reel <= len; s[copie++]=s[reel++]);
  7. }


 
 
 

Code :
  1. void rstrip(char s[])
  2. {
  3.     int reel;
  4.     for (reel=length(s) - 1; isspace(s[reel]) && reel >= 0; reel--);
  5.     s[reel + 1]='\0';
  6. }


Message édité par Sve@r le 19-06-2010 à 08:49:18

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-06-2010 à 14:10:54    

Code :
  1. #include <stdio.h>
  2. /* copy s to ss */
  3. while ((ss[i] = s[i]) != '\0')
  4. ++i;


 
 
Je pense pas que ça fasse ce que tu veux faire ça. Ca va comparer le résultat de l'affectation ss[i] = s[i] (i.e est-ce que l'affectation s'est bien déroulée ou pas) au caractère '\0', et pas le contenu de ss[i] et/ou de s[i] à '\0'. C'est possible que ça vaille quand même \0 quand on arrive à la fin du tableau sans erreur, mais si ta chaîne ne se termine pas par \0 t'auras une boucle infinie et probablement un segfault.

Message cité 1 fois
Message édité par Profil supprimé le 24-06-2010 à 14:14:07
Reply

Marsh Posté le 24-06-2010 à 14:21:55    

:non:  
Non l'opérateur = renvoie la valeur affectée... le test est correct.

Reply

Marsh Posté le 24-06-2010 à 17:10:16    

Même si la chaîne ne contient pas '\0' ?

Reply

Marsh Posté le 24-06-2010 à 17:15:53    


 
Ha bah si la chaine ne contient pas '\0' elle n'est pas formatée selon les règles...
Les librairies standards attendent un '\0' en fin de chaine, ne pas mettre peut donner des résultats assez inattendus.  :pt1cable:


---------------
sheep++
Reply

Marsh Posté le 28-06-2010 à 19:29:59    


Pas tout à fait infinie. La boucle continuera son itération en séquentiel dans la mémoire jusqu'à ce qu'elle trouve, quelque part, un '\0' ou alors jusqu'à ce qu'elle sorte de l'espace mémoire qui lui est alloué.
 
 
Probablement. Mais pour être exact, le comportement est indéterminé => rien ne te permet de prédire et/ou garantir ce qui se passera.
 
 
Alors ce n'est pas une chaine mais un simple tableau de caractères que tu ne peux pas faire traiter par les fonctions str...()


Message édité par Sve@r le 28-06-2010 à 19:32:25

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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