manipulation de chaine de caracteres

manipulation de chaine de caracteres - C - Programmation

Marsh Posté le 03-12-2011 à 18:18:57    

Bonjour,
 
en C j'essaye d'inverser une chaine de caractere.
void met_a_l_envers(char s[]) {
  int longueur,m,n,i;
  char p,q;
    longueur=strlen(s);
    m=longueur/2;
  if (longueur==m*2 ) {n=m-1;}
  if (longueur > m*2) {n=m;}
       for (i=0;i<=n;i++){
          p=s[i];
          s[i]=s[longueur-1-i]; /*la il aime pas.il plante*/
          s[longueur-1-i]=p;
          }
printf("%s\n", s);
}
 
quelqu'un a une idée.
Merci

Reply

Marsh Posté le 03-12-2011 à 18:18:57   

Reply

Marsh Posté le 03-12-2011 à 19:35:30    

Faire un "printf" de "longueur-1-i" avant cette ligne, pour vérifier qu'il n'y ait pas un problème d'indice [:figti]  
Attention aux cas où s est à NULL ou s'il s'agit d'une chaîne de longueur 0.
 
En faisant seulement "n=longueur/2;", ça ne suffirait pas :??:


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 03-12-2011 à 20:05:41    

Citation :

if (longueur==m*2 ) {n=m-1;}  
  if (longueur > m*2) {n=m;}

C'est ce qui est faux, par contre à priori, ça devrait pas faire planter.
Dans tous les cas de figure, c'est strlen(s)/2 la bonne borne.
Fait toi un dessin avec les deux cas de figure (pair et impair) pour t'en convaincre.
 

Code :
  1. char *reverse (char *s) {
  2.  
  3.    if (s) {
  4.         int size = strlen(s);
  5.         int last = size/2;
  6.         int i;
  7.         char c;
  8.  
  9.         for (i = 0; i < last; ++i) {
  10.             c = s[i];
  11.             s[i] = s[size-i-1];
  12.             s[size-i-1] = c;
  13.         }
  14.    }
  15.    return s;
  16. }


Note: Tu oublies de tester la validité des paramètres en entrée (pointeur nul ou pas).
Ce genre de fonction, c'est toujours bon de lui faire retourner la chaîne modifiée aussi.
Ça permet alors de faire des appels comme printf("%s\n", reverse(str));
A+,


Message édité par gilou le 03-12-2011 à 20:07:24

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

Marsh Posté le 03-12-2011 à 20:23:44    

effectivement je me suis enberlificoter avec les indices qui commencent à O dans le tableau s.
j'ai modifié un peu pour voir et ce qu'il aime pas c'est l'assignation s[i]= quelquechose.
 
Gilou tu retourne s mais s etant un pointeur est ce necessaire; est ce que le programme ne modifie pas a l'adresse de s ?
 
void met_a_l_envers(char s[]) {
  int longueur,m,n,i;
  char p,q;
    longueur=strlen(s);
    m=longueur/2;
 
       for (i=0;i<=m;i++){
          p=s[i];
          s[i]=p; et la ca plante
                                   /* s[i]=s[longueur-1-i]; la il aime pas.il plante*/
          s[longueur-1-i]=p;
          }
printf("%s\n", s);
}  
 
et tous cas merci pour les reponses

Reply

Marsh Posté le 03-12-2011 à 20:46:50    

Comme le code ne modifie pas l'adresse de s, celle ci ne peut être modifiée.  
 
Faudrait qu'on voie le reste de ton code pour voir pourquoi il  plante, car la cause est peut être ailleurs. Parce que chez moi, ça plante pas.
 
Tiens, pour le fun, la même fonction, en old style (pointeurs et pas d'appel de fonctions comme strlen et de variables int)
 

Code :
  1. char *reverse (char *s) {
  2.     if (s) {
  3.         char *p, *q, c;
  4.         p = q = s;
  5.         while (*q++) /* */;
  6.         q -= 2;
  7.         while (p < q) {
  8.             c = *p;
  9.             *p++ = *q;
  10.             *q-- = c;
  11.         }
  12.     }
  13.     return s;
  14. }


A+,


Message édité par gilou le 03-12-2011 à 21:44:11

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

Marsh Posté le 03-12-2011 à 21:45:24    

voila tout le code. Il n'y a pas grand chose de plus
 
void met_a_l_envers(char s[]) {
  int longueur,m,n,i;
  char p,q;
    longueur=strlen(s);
    m=longueur/2;
 
       for (i=0;i<=m;i++){
          p=s[i];
          s[i]=p; et la ca plante
                                   /* s[i]=s[longueur-1-i]; la il aime pas.il plante*/
          s[longueur-1-i]=p;
          }
printf("%s\n", s);
}  
 
int main() {
/*int i,y,z;
char c, s[]="345";
y=0;
z=0;
printf("%s",s);
for (i=0; i<3;i++){
y=pow(10,i);
z=s[i];
printf("i=%d   y=%d   z=%d   ",i,y,z);
}*/
 met_a_l_envers("1234" );
 
 
}

Reply

Marsh Posté le 03-12-2011 à 22:18:14    

Code :
  1. void met_a_l_envers(char s[]) {
  2.   int longueur,m,n,i;
  3.   char p,q;
  4.     longueur=strlen(s);
  5.     m=longueur/2;
  6.  
  7.        for (i=0;i<=m;i++){
  8.           p=s[i];
  9.           s[i]=s[longueur-1-i];
  10.           s[longueur-1-i]=p;
  11.           }
  12. printf("%s\n", s);
  13. int main() {
  14. /*int i,y,z;  
  15. char c, s[]="345";  
  16. y=0;  
  17. z=0;  
  18. printf("%s",s);  
  19. for (i=0; i<3;i++){  
  20. y=pow(10,i);  
  21. z=s[i];  
  22. printf("i=%d   y=%d   z=%d   ",i,y,z);  
  23. }*/
  24. met_a_l_envers("1234" );
  25. }

Je compile et j'exécute:

C:\clang>reverse
4231

[:souk]  
A+,
 


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

Marsh Posté le 03-12-2011 à 22:25:08    

Bon, par contre, effectivement gcc plante.
Mais si tu fais;

Code :
  1. void met_a_l_envers(char s[]) {
  2.   int longueur,m,n,i;
  3.   char p,q;
  4.     longueur=strlen(s);
  5.     m=longueur/2;
  6.  
  7.        for (i=0;i<=m;i++){
  8.           p=s[i];
  9.           s[i]=s[longueur-1-i];
  10.           s[longueur-1-i]=p;
  11.           }
  12. printf("%s\n", s);
  13. int main() {
  14. /*int i,y,z;  
  15. char c, s[]="345";  
  16. y=0;  
  17. z=0;  
  18. printf("%s",s);  
  19. for (i=0; i<3;i++){  
  20. y=pow(10,i);  
  21. z=s[i];  
  22. printf("i=%d   y=%d   z=%d   ",i,y,z);  
  23. }*/
  24.     char *s = malloc(5);
  25.     strcpy(s, "1234" );
  26. met_a_l_envers(s);
  27. }


 
ca marche.
Je pense que gcc considère "1234" comme une chaine constante qu'il refuse de modifier.
(je suis pas sur que tous les compilos se comportent pareil sur ce point)
A+,


Message édité par gilou le 03-12-2011 à 23:15:15

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

Marsh Posté le 03-12-2011 à 23:13:49    

Bon, pourquoi ton code plantait:
Ton appel met_a_l_envers("1234" ); passait la chaîne(considérée comme non modifiable) "1234" à la fonction, et ton code essayait de modifier cette chaîne.
 
Comment y remédier:
En faisant:
char s []= "1234";
met_a_l_envers(s);
 
La tu initialises un array de caractères avec les valeurs 1,2,3,4, et l'array est modifiable.
 
Attention, ce n'est pas la même chose que
char *s = "1234";
met_a_l_envers(s);
ou la tu fais pointer s sur une chaîne (considérée comme non modifiable) "1234", ce qui ferait encore planter ton code.
 
Dans ta boucle, la borne i<=m est fausse, c'est i<m, sinon tu fais une permutation de trop.
 
A+,


Message édité par gilou le 03-12-2011 à 23:16:11

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

Marsh Posté le 04-12-2011 à 14:27:34    

Ok, j'ai compris.
 
merci pour tout

Reply

Sujets relatifs:

Leave a Replay

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