renverser une chaine de caractere

renverser une chaine de caractere - C++ - Programmation

Marsh Posté le 16-10-2002 à 21:02:09    

j'arrive pas a voir pourquoi mon code me donne 'segmentation fault' aund je le compile.
la focntion doit renvoyer une chaine de caractere place dans str en la renversant : toto -> otot.
 
char    *my_revstr(char *str)
{
  int   len;
  int   i;
  int   j;
  char  *revstr;
 
  len = nb_char(str);
  *revstr = str[len];
  i = 0;
  j = len - 1;
  while (i < len)
    {
      i++;
      j--;
      revstr[j] = str[i];
    }
  revstr[len] = '\0';
  return (revstr);}
 
int     nb_char(char *str)
{
  int   c;
 
  for (c = 0; *str != '\0'; str++)
    c++;
  return (c);
}

Reply

Marsh Posté le 16-10-2002 à 21:02:09   

Reply

Marsh Posté le 16-10-2002 à 21:03:08    

Code foireux ici :
 

Code :
  1. i = 0;
  2. j = len - 1;
  3. while (i < len)
  4.    {
  5.      i++;
  6.      j--;
  7.      revstr[j] = str[i];
  8.    }


Reply

Marsh Posté le 16-10-2002 à 21:03:51    

Et aussi ici :
 

Code :
  1. *revstr = str[len];


Reply

Marsh Posté le 16-10-2002 à 21:05:16    

Ca aussi c'est completement faux, mais comme le debut est faux aussi ca compte plus :D
 

Code :
  1. revstr[len] = '\0';


 
Et on peut dire que ca aussi c'est pas top mais ca peux se faire :
 

Code :
  1. return (revstr);}

Reply

Marsh Posté le 17-10-2002 à 03:52:01    

On peut faire plus court...

Code :
  1. #define swapchar((a),(b)) do{char temp= (a); (a)=(b); (b)=temp} while(0)
  2. void strrev(char* str){
  3. char* pleft= str, pright= pleft+strlen(pleft);
  4. for( ; pleft<pright ; ++pleft, ++pright)
  5.  swapchar(*pleft,*pright);
  6. }


Edit: bogué, correction plus bas


Message édité par Musaran le 18-10-2002 à 04:40:27

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 17-10-2002 à 10:28:04    

Ou alors:

Code :
  1. char* myrev_str(char* string)
  2. {
  3.         char *start = string;
  4.         char *left = string;
  5.         char ch;
  6.         while (*string++);
  7.         string -= 2;
  8.         while (left < string)
  9.         {
  10.                 ch = *left;
  11.                 *left++ = *string;
  12.                 *string-- = ch;
  13.         }
  14.         return(start);
  15. }


 
Implemetation Microsoft... hummm...  :heink:


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 17-10-2002 à 10:41:33    

musaranmuasran : c pas la norme aue je dis utiliser a mon ecole.
 
YungMakko : tu mets *string- = ch; vdans le dernier while, tu t'es pas tromper ?
sinon, ca vaeut dire koi ?

Reply

Marsh Posté le 17-10-2002 à 12:23:51    

et tout simplement
 
std::reverse(str,str+strlen(str)+1);

Reply

Marsh Posté le 17-10-2002 à 12:32:46    

ou strrev(unechaine) :D


Message édité par antp le 17-10-2002 à 12:33:01

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-10-2002 à 15:05:40    

Musaran a écrit a écrit :

On peut faire plus court...

Code :
  1. #define swapchar((a),(b)) do{char temp= (a); (a)=(b); (b)=temp} while(0)
  2. void strrev(char* str){
  3. char* pleft= str, pright= pleft+strlen(pleft);
  4. for( ; pleft<pright ; ++pleft, ++pright)
  5.  swapchar(*pleft,*pright);
  6. }






Quel intérêt de mettre un while dans la macro. Il aurait été plus simple d'écrire :

Code :
  1. #define swapchar(a,b) { char temp=(a); (a)=(b); (b)=temp; }


En plus, il y a des parenthèses en trop dans la signature de la macro.
 
Je sais, tu vas me dire, du coup :

Code :
  1. swapchar(*pleft, *pright);

 sera expansé en :

Code :
  1. { char temp=(*pleft); (*pleft)=(*pright); (*pright)=temp; };


 
et il y aura un point-virgule supplémentaire après l'accolade fermante. Mais on s'en moque : le point-virgule est l'instruction vide en C, et le compilateur le reconnait comme une instruction valide qui ne génère aucune instruction assembleur derrière.

Reply

Marsh Posté le 17-10-2002 à 15:05:40   

Reply

Marsh Posté le 17-10-2002 à 15:25:13    

je precise que je ne doit utiliser aucune fct  de la lib-C, seulement des fcts que l'on code.

Reply

Marsh Posté le 17-10-2002 à 15:47:36    

antp a écrit a écrit :

ou strrev(unechaine) :D




 
C'est pas standard strrev... :na:

Reply

Marsh Posté le 17-10-2002 à 15:58:31    

Tiens oui, Win32 only d'après la doc de Borland :D


Message édité par antp le 17-10-2002 à 15:58:39

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-10-2002 à 16:05:11    

antp a écrit a écrit :

Tiens oui, Win32 only d'après la doc de Borland :D




 
man strrev
No manual entry for strrev.
 

Reply

Marsh Posté le 17-10-2002 à 16:15:15    

ouais bhen j'ai que Borland C++ 5 et Borland C++Builder 5 sous la main pour ce qui est du C++, j'ai pas pensé à cliquer sur "Portability" dans la doc :D


Message édité par antp le 17-10-2002 à 16:15:29

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-10-2002 à 17:23:42    

merci aund meme, ca m'a aide un peu

Reply

Marsh Posté le 18-10-2002 à 04:35:42    

YungMakko a écrit a écrit :

Implemetation Microsoft... hummm...  :heink:


Le source est peut-être efficace une fois passé par le compilateur.
L'appel à strlen est évité, mais j'aurais fait une macro à ce moment-là.
Par contre, le nom "string" est employé à tort !
 

BifaceMcLeOD  a écrit a écrit :

Quel intérêt de mettre un while dans la macro.
Je sais, tu vas me dire, du coup [...] il y aura un point-virgule supplémentaire après l'accolade fermante. Mais on s'en moque


Ça n'est pas inoffensif:

Code :
  1. //ceci...
  2. if(test1)
  3. swapchar(c1,c2);
  4. else
  5. //else part
  6. //...deviendrait cela
  7. if(test1)
  8. {char temp= (c1); (c1)=(c2); (c2)=temp;}; //fin du if
  9. else //else sans if
  10. //else part

Le ";" termine prématurément le if, et le else se retrouve tout seul (erreur).
Pire, si le if est imbriqué, le else se rattache silencieusement au if supérieur.
Source: http://www.isty-info.uvsq.fr/~rume [...] .html#q_16
 

Citation :

En plus, il y a des parenthèses en trop dans la signature de la macro.

Copier-coller powered.
La macro est mal formée, c'est une erreur.
 
Par contre, tu n'as pas remarqué:

Code :
  1. (b)=temp} //; manquant
  2. char* pleft, pright; //* manquante
  3. str+strlen(str); //-1 manquant
  4. ++pleft, ++pright) //-- et pas ++

Voilà ce que c'est d'avoir trop confiance en soi, de ne pas tester son code, et de poster à 4h du matin.
 
(Testé cette fois-ci)

Code :
  1. #include <stddef.h>
  2. #define swapchar(a,b) do{char temp= (a); (a)=(b); (b)=temp;} while(0)
  3. #define STRFIND0(p) for( ; *p!='\0' ; ++p);
  4. //longueur utile (je la mets, au cas où...)
  5. ptrdiff_t strlen(const char* str){
  6. const char* p= str;
  7. for( ; *p!='\0' ; ++p);
  8. return p-str;
  9. }
  10. //trouve le 0 terminal (version pointeurs de non-const)
  11. char* strfind0(char* p){
  12. for( ; *p!='\0' ; ++p);
  13. return p;
  14. }
  15. //retournement
  16. void strrev2(char* str){
  17. char* pleft= str, *pright= strfind0(str)-1;
  18. for( ; pleft < pright ; ++pleft, --pright)
  19.  swapchar(*pleft,*pright);
  20. }
  21. int main(){
  22. char test[]= "Bla talk";
  23. strrev2(test);
  24. }


Message édité par Musaran le 18-10-2002 à 04:39:32

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 18-10-2002 à 10:39:01    

Musaran a écrit a écrit :

Le source est peut-être efficace une fois passé par le compilateur.
L'appel à strlen est évité, mais j'aurais fait une macro à ce moment-là.
Par contre, le nom "string" est employé à tort !
 
Ça n'est pas inoffensif:

Code :
  1. //ceci...
  2. if(test1)
  3. swapchar(c1,c2);
  4. else
  5. //else part
  6. //...deviendrait cela
  7. if(test1)
  8. {char temp= (c1); (c1)=(c2); (c2)=temp;}; //fin du if
  9. else //else sans if
  10. //else part

Le ";" termine prématurément le if, et le else se retrouve tout seul (erreur).
Pire, si le if est imbriqué, le else se rattache silencieusement au if supérieur.
Source: http://www.isty-info.uvsq.fr/~rume [...] .html#q_16




 :jap:  
 

Citation :

Par contre, tu n'as pas remarqué:[cpp]
(...)

Je n'ai pas relu tout ton code, non plus, je te faisais confiance...  :sarcastic:  :D

Reply

Marsh Posté le 18-10-2002 à 11:14:46    

Code :
  1. #include <string.h>
  2. char *my_revstr(char *str)
  3. {
  4.   int len = strlen(str);
  5.   char temp;
  6.   int cpt;
  7.   for (cpt = 0; cpt < (len / 2); cpt++)
  8.     {
  9.       temp = str[cpt];
  10.       str[cpt] = str[len - cpt - 1];
  11.       str[len - cpt - 1] = temp;
  12.     }
  13.   return (str);
  14. }


Message édité par nykouze le 18-10-2002 à 11:15:47
Reply

Marsh Posté le 18-10-2002 à 19:47:39    

Correction :
 
char    *my_revstr(char *str)
{
  int len;
  int cpt;
  int swap;
 
  len = my_strlen(str);
  cpt = 0;
  len--;
  while (cpt < len)
    {
      swap = str[cpt];
      str[cpt] = str[len];
      str[len] = swap;
      len--;
      cpt++;
    }
  return (str);
}
 
int     my_strlen(char *str)
{
  int   c;
 
  for (c = 0; *str != '\0'; str++)
    c++;
  return (c);
}
 
voila ce ke je devais coder

Reply

Marsh Posté le 19-10-2002 à 03:54:04    

oh vla qq d epitech qui veut pas faire son taff :o


---------------
Quand est ce qu elle va venir Mme Cohenne :cry:
Reply

Marsh Posté le 19-10-2002 à 03:55:20    

Code :
  1. char  *my_revstr(char *str)
  2. {
  3.   int  len;
  4.   int  pos;
  5.   char  temp;
  6.  
  7.   len = my_strlen(str);
  8.   for (pos = 0; pos < len / 2; pos++)
  9.     {
  10.       temp = *(str + pos);
  11.       *(str + pos) = *(str + len - pos - 1);
  12.       *(str + len - pos - 1) = temp;
  13.     }
  14.   return (str);
  15. }


 

Code :
  1. int  my_strlen(char *str)
  2. {
  3.   unsigned int count;
  4.  
  5.   for (count = 0; *str; count++)
  6.     str++;
  7.   return (count);
  8. }


 
 
comme ca c plus propre


---------------
Quand est ce qu elle va venir Mme Cohenne :cry:
Reply

Marsh Posté le 19-10-2002 à 04:59:30    

Code :
  1. int len;
  2. int cpt;
  3. int posright, posleft; //ces noms peu explicites auraient induit en erreur...


Code :
  1. len = my_strlen(str);
  2. len--;
  3. len = my_strlen(str)-1; //ne surtout pas faire ça, c'est inutilement compliqué !


Code :
  1. cpt = 0;
  2. while (cpt < len){
  3. //...
  4. cpt++;
  5. }
  6. for(cpt= 0 ; cpt<len ; cpt++ ){ //ceci briserait la structure du programme, pas bon !
  7. //...
  8. }

Enfin bon, ce que j'en dis, moi...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 20-10-2002 à 11:37:06    

apres avoir passe 5-6 h sur une fonction, j'en pouvais plus alors je suis venu ici.
a +

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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