C probleme code fonction inverse

Résolu
Bonjour,

je cherche des codes sur le net me permettant de travailler sur des chaines j'ai trouvé cet exemple permettant d'inverser 2 chaines mais il ne fonctionne pas... quelqu'un peut m'aider à le faire fonctionner svp ?

/*
Écrire une fonction qui inverse une chaîne de caractères et met le résultat dans une autre. Les chaînes sont données en argument.*/

void inverse_chaine(const char chaine[MAX], char inv[MAX])
{
int i;
int j =longueur_chaine(chaine)-1;
for(i=0;chaine[i]!='\0',i++)
{
inv[i]=chaine[longueur_chaine(chaine)--];
j--;
}
}

tout le reste du code fonctionne, toutes les autres fonctions sauf la fonction inverse_chaine ....... je comprends pas ... :(

#include <stdio.h>
#include <stdlib.h>
//#include "proto.h";

// constantes
const MAX = 100;

//prototypes
void lire_chaine(char tab[MAX]);

/*En utilisant la fonction getchar()qui permet de lire un caractère saisi au clavier et qui le
retourne, écrire une fonction qui lit une chaîne de caractères tapée au clavier et qui l'enregistre
dans un tableau de caractères. Le caractère saut de ligne '\n' indiquera la fin de la saisie.*/
void lire_chaine(char tab[MAX])
{
int i=0;
char c;
c=getchar();
while((c!='\n')&&(i<MAX))
{
tab[i++]=c;
c=getchar();
}
tab[i]='\0';
}

/*Écrire une fonction qui calcule la longueur d'une chaîne.*/
int longueur_chaine(const char tab[MAX])
{
int i;
for (i = 0; tab[i] != '\0'; i++);
return i;
}

/*Écrire une fonction supprime_espace qui supprime les espaces et tabulations d'une
chaîne de caractères. Cette fonction ne doit pas utiliser de tableau intermédaire.*/
void supprime_espace(char tab[MAX])
{
int i;
int j=0;
for (i = 0; tab[i] != '\0'; i++)
if (tab[i] != ' ' && tab[i] != '\t')
{
tab[j] = tab[i];
j++;
}
tab[j] = '\0';
}

/*Écrire une fonction qui inverse une chaîne de caractères et met le résultat dans une autre. Les
chaînes sont données en argument.*/
void inverse_chaine(const char chaine[MAX], char inv[MAX])
{
int i;
int j =longueur_chaine(chaine)-1;
for(i=0;chaine[i]!='\0',i++)
{
inv[i]=chaine[longueur_chaine(chaine)--];
j--;
}
}

/*main*/
int main(int argc, char *argv[])
{
char chaine1[MAX]; //declaration tableau
char inverse_chaine1[MAX];
int valeur = 0;

lire_chaine(chaine1); // appel de la fonction lire_chaine
printf("chaine : %s \n", chaine1 ); // affichage resultat fonction lire_chaine

valeur = longueur_chaine(chaine1); // appel de la fonction longueur_chaine
printf("taille de la chaine = %d\n", valeur); // affichage resultat fonction longueur_chaine

supprime_espace(chaine1); // appel fonction supprime_espace
printf("chaine sans espaces: %s \n", chaine1 ); // affichage resultat fonction supprime espace

inverse_chaine(chaine1, inverse_chaine1);
printf("chaine inverse: %s \n", inverse_chaine1);
}

5 réponses

  1. J'ai réussi merci

    void inverse_chaine(const char chaine[MAX], char inv[MAX])
    {
    int i = 0;
    int j =longueur_chaine(chaine)-1;
    for (i = 0 ; i < MAX ; i++)
    {
    inv[i] = 0;
    }
    for(i=0;chaine[i]!='\0';i++)
    {
    inv[i]=chaine[j];
    j--;
    }
    }

    //appel dans le main

    inverse_chaine(chaine1, inverse_chaine1);
    printf("chaine 1 : %s\nchaine inverse: %s \n\n", chaine1 , inverse_chaine1);
    1. Bonjour,
      Quand tu compiles le code, quel est le message d'erreur sur la sortie standart?
      Cdt.
      1. inv[i]=chaine[longueur_chaine(chaine)--];

        il me met une erreur sur cette ligne en me disant

        error : 1value required as decrement operand
    2. Salut !!!

      Ce code est du charabia ! ça donne pas envie de l'étudier !
      Ya déjà des bibliothèques déjà prêtes pour permuter deux chaines de caractères !

      Par exemple !

      #include <stdio.h> 
      #include <string.h> 
      
      int permuterChaines(char chaine1[],char chaine2[]) { 
              char help[60]; 
      
              if(strlen(chaine1) != strlen(chaine2)) { 
                      return 0; 
              } 
      
              strcpy(help,chaine1); 
              strcpy(chaine1,chaine2); 
              strcpy(chaine2,help); 
              return 1; 
      } 
      
      int main(int argc, char *argv[]) { 
              char chaine1[] = "Bonjour"; 
              char chaine2[] = "Bonsoid"; 
      
              if(permuterChaines(chaine1,chaine2)) 
                      printf("Chaine 1 : %s\nChaine 2 : %s",chaine1,chaine2); 
              else printf("Tailles des chaines differentes, permutation impossible !"); 
      
              return 0; 
      }


      Mettez en résolu quand c'est résolu -.- ...
      1. et si ta chaine de caratère est supérieure à help[60] ? ça va seg fault ...
      2. Ben reste qu'a l'optimiser ! : )

        int permuterChaines(char chaine1[],char chaine2[]) {
                char *pnt = NULL;
        
                if(strlen(chaine1) != strlen(chaine2)) {
                        return 0;
                }
        
                pnt = (char*) malloc(sizeof(chaine1));
                if(pnt == NULL) return 0;
        
                strcpy(pnt,chaine1);
                strcpy(chaine1,chaine2);
                strcpy(chaine2,pnt);
                free(pnt);
        
                return 1;
        }
    3. en fait ce que je voudrais faire...

      c'est avec ma chaine1 (par exemple : bonjour)

      mettre dans chaine2 l'inverse (il me mettra "roujnob")
      1. Et t'as voulu faire ça en une 50aine de lignes !!! :s

        void inverserChaine(char chaine[]) {
                char car;
                int i, taille = strlen(chaine);
        
                for(i=0; i<taille/2; i++) {
                        car = chaine[i];
                        chaine[i] = chaine[taille-i-1];
                        chaine[taille-i-1] = car;
                }
        }
        
        int main(int argc, char *argv[]) { 
                char chaine1[] = "Bonjour";
        
                inverserChaine(chaine1);
                printf("%s",chaine1);
        
                return 0;
        }
        
      2. oui mais là tu remplaces la même chaîne, moi je voudrais avoir une chaine 1 , et dans une chaine 2 mettre l'inverse de la chaine 1