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

  FORUM HardWare.fr
  Programmation
  C

  manipulation de chaine de caracteres

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

manipulation de chaine de caracteres

n°2114659
ikik38
Posté le 03-12-2011 à 18:18:57  profilanswer
 

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

mood
Publicité
Posté le 03-12-2011 à 18:18:57  profilanswer
 

n°2114680
mrbebert
Posté le 03-12-2011 à 19:35:30  profilanswer
 

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.
n°2114684
gilou
Modérateur
Modzilla
Posté le 03-12-2011 à 20:05:41  profilanswer
 

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é!  --
n°2114687
ikik38
Posté le 03-12-2011 à 20:23:44  profilanswer
 

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

n°2114690
gilou
Modérateur
Modzilla
Posté le 03-12-2011 à 20:46:50  profilanswer
 

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é!  --
n°2114694
ikik38
Posté le 03-12-2011 à 21:45:24  profilanswer
 

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" );
 
 
}

n°2114698
gilou
Modérateur
Modzilla
Posté le 03-12-2011 à 22:18:14  profilanswer
 

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é!  --
n°2114700
gilou
Modérateur
Modzilla
Posté le 03-12-2011 à 22:25:08  profilanswer
 

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é!  --
n°2114705
gilou
Modérateur
Modzilla
Posté le 03-12-2011 à 23:13:49  profilanswer
 

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é!  --
n°2114741
ikik38
Posté le 04-12-2011 à 14:27:34  profilanswer
 

Ok, j'ai compris.
 
merci pour tout


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

  manipulation de chaine de caracteres

 

Sujets relatifs
Extraire du texte de longueur variable dans une chaineRecherche de chaîne.
remplacer une chaine par une autre à partir d'une listerecuperer un nombre depuis une chaine de caractere
Convertir la date et l'heure courante en chaîne de caractères.[Améliorations] Programme de manipulation de fichiers
[lazarus] Manipulation de chaine et extraction de caractèreC++, Compter des caractères ...
[ ASP / JavaScript ? ] Manipulation chaîne de caractèresPetit soucis avec manipulation fichier + chaine de caractères - VB
Plus de sujets relatifs à : manipulation de chaine de caracteres


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