IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonction inversion sens des mots


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2011
    Messages : 68
    Par défaut Fonction inversion sens des mots
    Bonsoir

    Je sollicite de l'aide sur une fonction inversion de sens des mots

    Je voudrais que ma fonction fonctionne de la manière suivante

    entrée => la voiture est verte

    sortie => verte est voiture la

    Or, je ne récupère que le premier mot "verte"

    Merci pour votre aide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #define MAXLINE 512
    int n;
        int i=0;
        char line[MAXLINE];
        int word=0;
        int lengthText=0;
        int length=0;
        char line2[MAXLINE];
     
    lengthText = strlen(line);
           length = lengthText;
     
     
    while(length > 0)
    	{
    	    while((line[lengthText]!=' ') && (lengthText!=0))
    	    {
    	      lengthText--;
    	    }
     
    	    if(lengthText==0)
    	    {
    	      word = lengthText;
     
    	    }else{
     
    	      word = lengthText + 1;
     
    	    }
     
    	    while(word != length)
    	    {
    	      line2[i] = line[word];
    	      word++;
    	      i++;
    	    }
     
    	    line2[i] = ' ';
    	    i++;
    	    length = length - (word - lengthText);
    	    lengthText--;
    	} 
     
    fputs(line2,stdout);

  2. #2
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 418
    Par défaut
    Salut,

    Il marche bien ton code chez moi. Il est pas très élégant, mais fonctionnel.
    A un détail près. Tu met pas de nul à la fin de ta chaîne, du coup tu print les 512 caractères.

    Je te propose une autre version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
      #define MAXLINE 512
     
      char cDest[MAXLINE];
      const char *cSrc = "la voiture est verte\0";
     
      int iSrcPos=0; // On commence au début de la chaine source
      int iDestPos = strlen(cSrc); // Et a la fin de la destination
      cDest[iDestPos] = '\0'; // On met un nul a la fin de la destination
     
      // Une petite variable temp puisqu'on sait pas la taille du mot d'avance
      char cTmp[MAXLINE>>1]; 
     
      // Tant que j'ai pas rempli ma destination, il me reste des mots.
      while(iDestPos >= 0) 
      {
        // On prend le premier mot dans la cahine a partir de la position currente
        int iLen;
        sscanf(&cSrc[iSrcPos], "%s%n", cTmp, &iLen);
        // On l'insere a l'arriere de la destination
        memcpy(cDest+(iDestPos-=iLen)*sizeof(char), &cSrc[iSrcPos], iLen);
        // On avance au mot suivant avec l'espace.
        iSrcPos+=iLen+1;
        // Ajoute de l'espace, mais pas au premier mot
        if(iDestPos > 0) cDest[--iDestPos] = ' ';
      }
     
      fputs(cDest,stdout);
    A+

  3. #3
    Membre actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2011
    Messages : 68
    Par défaut
    Bonjour

    Merci pour ton aide !

    cela marche parfaitement pour l'affichage mais il se trouve que j'envoie cette chaine a un autre programme qui doit l'afficher à l'écran

    pour cela j'utilise la fonction write (sock2, cDest, n);

    avec n = strlen (cDest);

    La chaine s'affiche bien le recepteur mais le résultat est :
    verte est voiture laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(J'ai raccourci ^^)


    Faut-il rajouter une fonction pour compter les caractères dans le récepteur ?

    Merci

    Recepteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    int service (nsock)
    int nsock;
    {
    	int n;
    	char line[MAXLINE];
    	n = readline(nsock, line, MAXLINE);
    	if (n < 0)
    	{
    		perror("Pb lecture de ligne");
    		return;
    	}
    	fputs(line, stdout);
     
    }
     
    int readline(fd, ptr, maxlen)
    int fd;
    char *ptr;
    int maxlen;
    {
    	int n, rc;
    	char c;
    	for (n=1; n < maxlen; n++)
    	{
    		rc = read(fd, &c, 1);
    		*ptr++ = c;
    		if (c == '\n')
    			break;
    	}
    	*ptr = '\0';
    	return(n);
    }

  4. #4
    Membre très actif
    Avatar de EtherOS
    Homme Profil pro
    Etudiant Polytechnicien
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Etudiant Polytechnicien
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut Inversion d'un chaine de caractere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    /*pas de certitude (car pb avec ma machine actuelle , le code n'est pas testé)si ca marche juste pour te donner quelques idées*/
    
    /*contient les fonctions printf, scanf etc...*/
    
    #include <stdio.h>
    
    /*contient les fonctions strlen,strcat,strcmp,etc...*/
    #include <string.h>
    /*appel de malloc, callloc*/
    #include <stdlib.h>
    /*arret du programme*/
    
    #define EXIT_STATUS  0
    /*fonction principale*/
    int main()
    {
      /*initialisation des chaines et du compteur*/
      char *chaine1, *chaine2 ="";
      int loop = 0;
      /*affichage de la chaine de caractères*/
      printf("Entrer votre chaine:\n");
      /* lecture de la chaine*/
      scanf("%s",chaine1);
      /*allocation a chaine1 la taille sizeof(char)*/
      chaine1 = (char*)malloc(sizeof(char));
      /*on entre dans la boucle */
      while( loop < strlen(chaine1))
      {
       /*on concatène la chaine2 avec chaque caractère de chaine1 dans l'ordre decroissant*/
        chaine2 = strcat(chaine[strlen(chaine1)-loop], chaine2);
        loop++;
       }
       /*affichage de la chaine inversée*/
       printf("Le resultat est: %s",chaine2);
       /*on libere l'espace alloué */
       free(chaine1);
       return(EXIT_STATUS);
    }

  5. #5
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 418
    Par défaut
    Salut EtherOS,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      char *chaine1, *chaine2 ="";
      [...]
      scanf("%s",chaine1);
      chaine1 = (char*)malloc(sizeof(char));
      while( loop < strlen(chaine1))
      {
        chaine2 = strcat(chaine[strlen(chaine1)-loop], chaine2);
        loop++;
       }
    À la ligne 1 tu crées un pointer chaine1 sans l'initialiser.
    À la ligne 3, tu veut lire une entrée et la mettre dans chaine1, un premier crash.
    À la ligne 4, tu alloue 1 char à chaine1. Puis à la ligne suivante tu fais une boucle sur strlen(chaine1). Hors il n'y a pas de caractère nul puisque tu viens d'allouer un tableau d'un seul char. Le résultat d'strlen est donc indéterminé.
    Mais même si tout ça fonctionné, ce que tu propose à totow, c'est d'inverser les caractères de ça chaîne (c.f. ligne 7 et 8). Hors, il voulait inverser les mots.

  6. #6
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 418
    Par défaut
    Citation Envoyé par totow Voir le message
    pour cela j'utilise la fonction write (sock2, cDest, n);

    avec n = strlen (cDest);

    La chaine s'affiche bien le recepteur mais le résultat est :
    verte est voiture laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(J'ai raccourci ^^)


    Faut-il rajouter une fonction pour compter les caractères dans le récepteur ?
    C'est pas très clair totow
    Donne moi le code de l'émetteur, il est aussi important que le récepteur.
    Dis moi aussi ce que doit faire le récepteur.

    Et donne moi un code compréhensible. Celui que tu m'as donné n'a pas de commentaires et est plein de fautes. Résultat, je vois pas vraiment ce que tu veux faire.

    Notamment:
    Citation Envoyé par totow Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int readline(fd, ptr, maxlen)
    int fd;
    char *ptr;
    int maxlen;
    Pas de ; à readline. C'est une déclaration ? Si oui, tu type pas les paramètres. Et c'est quoi ces déclarations de variables après ?

    A+

  7. #7
    Membre actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2011
    Messages : 68
    Par défaut
    Alors en fait le une fois la chaine inversé celle ci est envoyé a un autre programme sur la machine par l’intermédiaire d'une trame tcp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
      #define MAXLINE 512
     
      char cDest[MAXLINE];
      const char *cSrc = "la voiture est verte\0";
     
      int iSrcPos=0; // On commence au début de la chaine source
      int iDestPos = strlen(cSrc); // Et a la fin de la destination
      cDest[iDestPos] = '\0'; // On met un nul a la fin de la destination
     
      // Une petite variable temp puisqu'on sait pas la taille du mot d'avance
      char cTmp[MAXLINE>>1]; 
     
      // Tant que j'ai pas rempli ma destination, il me reste des mots.
      while(iDestPos >= 0) 
      {
        // On prend le premier mot dans la cahine a partir de la position currente
        int iLen;
        sscanf(&cSrc[iSrcPos], "%s%n", cTmp, &iLen);
        // On l'insere a l'arriere de la destination
        memcpy(cDest+(iDestPos-=iLen)*sizeof(char), &cSrc[iSrcPos], iLen);
        // On avance au mot suivant avec l'espace.
        iSrcPos+=iLen+1;
        // Ajoute de l'espace, mais pas au premier mot
        if(iDestPos > 0) cDest[--iDestPos] = ' ';
      }
    write (sock2, cDest, n);
    Une fois arrivée sur le récepteur, la trame s'affiche immédiatement dans la fenêtre à l'aide de ces deux fonctions.

    La variable line contient la chaine envoyée par l'émetteur(cDest)

    le résultat est le suivant sur le récepteur

    verte est voiture laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(J'ai raccourci ^^)


    En espérant être clair ^^ Merci pour ton aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    /***************************************************/
    /* Fonction service                                */
    /***************************************************/
    int service (nsock)
    int nsock;
    {
    	int n;
    	char line[MAXLINE];
    	n = readline(nsock, line, MAXLINE);
    	if (n < 0)
    	{
    		perror("Pb lecture de ligne");
    		return;
    	}
    	fputs(line, stdout);
     
    }
     
    /****************************************************/
    /* Fonction readline : lit une ligne sur le socket fd caractère par caractère */
    /****************************************************/
    int readline(fd, ptr, maxlen)
    int fd;
    char *ptr;
    int maxlen;
    {
    	int n, rc;
    	char c;
    	for (n=1; n < maxlen; n++)
    	{
    		rc = read(fd, &c, 1);
    		*ptr++ = c;
    		if (c == '\n')
    			break;
    	}
    	*ptr = '\0';
    	return(n);
    }

  8. #8
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 418
    Par défaut
    Salut

    Tout d'abord, il y a un petit bug dans le code que je t'ai donnée. On aurait du lire while(iDestPos > 0) plutôt que while(iDestPos >= 0). Et idéalement, on pourrait écrire while(sscanf(&cSrc[iSrcPos], "%s%n", cTmp, &iLen) > 0) car on vérifie déjà iDestPos >= 0 dans la boucle qui peut servir de condition de sortie.

    Pour revenir à ton problème:
    1 - Tu fais des readline, donc il faut envoyer des lignes. Changes ton '\0' par un '\n'
    2 - J'ai l’impression que n est mal intiialisé. Est-il vraiment égal à strlen(cSrc) + 1 ?

Discussions similaires

  1. Fonction SI pour des mots
    Par Mik13c dans le forum Excel
    Réponses: 3
    Dernier message: 24/07/2013, 10h57
  2. Fonction filtre pour des mots bannis
    Par yule dans le forum Langage
    Réponses: 2
    Dernier message: 30/10/2008, 20h21
  3. Erreur sur fonction d'extraction des mots
    Par Siguillaume dans le forum Langage
    Réponses: 16
    Dernier message: 11/06/2008, 10h16
  4. Inverser le sens des axes d'une figure
    Par judith dans le forum MATLAB
    Réponses: 1
    Dernier message: 21/05/2008, 14h35
  5. Réponses: 5
    Dernier message: 16/05/2007, 23h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo