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

  FORUM HardWare.fr
  Programmation
  C

  programme débutant sur les chaînes.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

programme débutant sur les chaînes.

n°2001999
Profil sup​primé
Posté le 16-06-2010 à 03:12:07  answer
 

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]  
 

mood
Publicité
Posté le 16-06-2010 à 03:12:07  profilanswer
 

n°2002001
Profil sup​primé
Posté le 16-06-2010 à 04:53:15  answer
 

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

n°2002873
Sve@r
Posté le 18-06-2010 à 19:38:53  profilanswer
 


 
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.
n°2004459
Profil sup​primé
Posté le 24-06-2010 à 14:10:54  answer
 

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
n°2004467
h3bus
Troll Inside
Posté le 24-06-2010 à 14:21:55  profilanswer
 

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

n°2004530
Profil sup​primé
Posté le 24-06-2010 à 17:10:16  answer
 

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

n°2004537
h3bus
Troll Inside
Posté le 24-06-2010 à 17:15:53  profilanswer
 


 
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++
n°2005444
Sve@r
Posté le 28-06-2010 à 19:29:59  profilanswer
 


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.

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

  programme débutant sur les chaînes.

 

Sujets relatifs
Supra débutant SVP (QT - PYTHON)pourquoi le programme html &css change selon le navigateur
Impossible d'executer un programme après compilation (DLL manquante)tutoriel pour débutant drools
Programme fonctionnant sur mon ordi, et non sur un autre[Debutant] Python + MYSQL Python, erreur syntaxe dans requette MYSQL
Débutant aide C++Débutant en Java j'y arrive même pas à ça :( :( :(
Structure / Chaines / printf erronéprogramme spirographe
Plus de sujets relatifs à : programme débutant sur les chaînes.


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