[C] probleme avec la fonction de suppression

Bonjour,
j'ai un souci avec cette fonction qui plante mon programme :
char* enlever_dernier_mot(char* chaine)
{
   int i,pos,size;
   size=strlen(chaine);
   pos=-1;
   for(i=0;i<size;i++)
   {
     if (chaine[i]==' ')
     {
        pos = i;
     }
   }
   if (pos!=-1)
      chaine[pos] = '\0';
   return chaine;   
}


cette fonction supprime le dernier mot d'une phrase.
J'attends vos reponses.
merci
Configuration: Windows Vista
Internet Explorer 7.0

5 réponses

  1. Contributeur
    Salut.
    Je ne comprends vraiment pas pourquoi il y a un souci, je ne voi aucune erreur...
    La seul est peut ^^etre que chaine n'a pas de caractère '\0' et que strlen renvoie n'importe quoi
    1
    1. Bonjour,

      Tu peux préciser davantage car je viens de tester ta proc et je n'ai pas eu de problème !
      0
      1. merci cchristian,
        jai un probleme dans toute cette fonction: elle se plante
        void GenNseq(Liste *seq)
        {int i;
        char *mot;
        Liste *p;
        Liste *q;
        Liste *chaine=NULL;
        char *moRes;
        char *moRes1;
             Liste ** tab;
             char *pointeur;
             char* copi;
        char *separateur = { " " };
        char *buff;
            tab = (Liste **) malloc (20 * sizeof(Liste *));
              tab [0]=seq;
              buff =tab[0]->mot;
            printf ("%s", tab[0]->mot);
            //test sur les element des 2seq sil ya une jointure
         printf("voila la 3sequence");
        
        
        for(p=seq;p!=NULL;p=p->suivant){
          for (q=seq->suivant;q!=NULL;q=q->suivant){
           if (strcmp(dernier(p->mot),premier(q->mot)  )==0)
            
            moRes=enlever_dernier_mot(p->mot);
          //moRes1=strcat(moRes, q->mot);
            // chaine=InsertionEnTete(chaine, p->mot);
          
            
         
        }
         }
         printf("%s", chaine->mot);
         //printf("%s", chaine->mot)
          //printf("voila la liste jointe");
         
        //AfficherListe(chaine);
        }
        0
    2. Modérateur
      #include <string.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <ctype.h>
      
      void supprimer_dernier_mot(const char *str,char *str2){
          const unsigned n = strlen(str);
          unsigned i;
          for(i=0;i<n;++i){
              if(isspace(str[n-i])){
                  str2 = strncpy(str2,str,n-i);
                  return;
              }
          }
          str2 = "";
      }
      
      int main(){
          const char *str="j'aime les tapirs";
          char *str2 = (char *)malloc(strlen(str)*sizeof(char));
          supprimer_dernier_mot(str,str2);
          printf("str = [%s]\nstr2 = [%s]\n",str,str2);
          free(str2);
          return 0;
      }

      Bonne chance
      0
      1. merci Mamiemando,
        faut qu'elle retourne la chaine moin le dernier mot:
        0
      2. ca devient plus compliqué :)
        elle me retourne pas la nouvelle chaine, deja le type de retour est void
        0
    3. Modérateur
      Oui et bien c'est le cas :
      (mando@silk) (~) $ gcc -W -Wall plop.c
      (mando@silk) (~) $ ./a.out
      str = [j'aime les tapirs]
      str2 = [j'aime les]
      0
      1. Contributeur
        Salut

        J'ai essayé de respecter ta fonction. C'est-à-dire, de renvoyer un char* et de modifier la chaine que tu lui envoies.
        Ceci donne :
        #include <stdio.h>
        #include <string.h>
        
        char * supprimerMot(char *buf){
        	int i;
        	for(i=strlen(buf)-1;i>=0;i--)
        		if(buf[i]==' '){
        			buf[i]='\0';
        			return buf;
        		}
        
        	return buf;
        }
        
        int main(void){
        	char chaine[]="j'aime les tapirs";
        	char *res=supprimerMot(chaine);
        
        	printf("chaine=%s\nres=%s\n",chaine,res);
        	return 0;
        }
        


        Cdt
        0
        1. merci Fiddy
          void GenNseq(Liste *seq)
          {int i;
          char *mot;
          Liste *p;
          Liste *q;
          Liste *chaine=NULL;
          char *moRes;
          char *moRes1;
               Liste ** tab;
               char *pointeur;
               char* copi;
          char *separateur = { " " };
          char *buff;
              tab = (Liste **) malloc (20 * sizeof(Liste *));
                tab [0]=seq;
                buff =tab[0]->mot;
              printf ("%s", tab[0]->mot);
              //test sur les element des 2seq sil ya une jointure
           printf("voila la 3sequence");
           
           
          for(p=seq;p!=NULL;p=p->suivant){
            for (q=seq->suivant;q!=NULL;q=q->suivant){
             if (strcmp(dernier(p->mot),premier(q->mot)  )==0)
              moRes=(char *)malloc(strlen(p->mot)*sizeof(char));
              strcpy(moRes,p->mot);
              moRes=enlever_dernier_mot(p->mot);
              free(moRes);
           
            //moRes1=strcat(moRes, q->mot);
              // chaine=InsertionEnTete(chaine, p->mot);
            
              
           
          }
           }
           printf("%s", chaine->mot);
           //printf("%s", chaine->mot);
            //printf("voila la liste jointe");
           
          //AfficherListe(chaine);
          }
          


          J'ai un probleme avec une fonction (je code en C)
          cette fonction pren en entrée une liste chainée qui contient des couples de mots (exemple: "bonjour le", "le monde", "le garçon").
          cette fonction parcour cette liste chainée afin de produire une nouvelle liste de triple de mots (exemple "bonjour le monde") selon une condition (si le dernier mot de la liste égal au premier) ici, on a par exemple ("bonjour le" et "le monde"): pour produire une nouvelle sequence "bonjour le monde" .
          là ya pas d'erreurs mais un message s'affiche " projet2.exe a céssé de fonctionné"

          merci d'avance
          0
        2. Je pense que le probleme est dans les 2 boucles !!!
          bizarre merci
          0