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 :

effacer la commande


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut effacer la commande
    bonjour

    voila je m'oppose à un problème.

    sur mon tchate lorsque le client marque une phrases et appui sur "entrer" le message est envoyer au serveur puis et renvoyer au client (donc moi) du coup je me retrouve avec un client qui affiche 2 fois la même phrases (en plus c'est super moche)
    y aurais t-il moyen "d'effacer" la commande rentrer ? mais sans effacer tout les messages reçu avant ? (donc pas system("CLS"); )

    screen:
    ICI

    partie de la source qui gère les caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while(1)
    {
    printf("\n ");
     
    fgets(chaine, sizeof chaine, stdin);
        clean(chaine);
     
     
        snprintf(buffer, sizeof(buffer), "%s : %s ", pseudo, chaine);
        //snprintf n'affiche pas le message (temps mieux sinon y aurait 3x le même message)
     
       send(s, buffer, strlen(buffer), 0); 
    }



    pour me faire plus claire je vais vous montrer un exemple simple.
    avec cette source:
    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
    #include <stdio.h>
    #include <string.h>
     
    static void purger(void)
    {
        int c;
     
        while ((c = getchar()) != '\n' && c != EOF)
        {}
    }
     
    static void clean (char *chaine)
    {
        char *p = strchr(chaine, '\n');
     
        if (p)
        {
            *p = 0;
        }
     
        else
        {
            purger();
        }
    }
     
    int main (void)
    {
        char chaine[20], chaine2[20];
     
        printf("Tapez une phrase : \n");
        fgets(chaine, sizeof chaine, stdin);
        clean(chaine);
        printf("Vous avez tape : '%s'", chaine);
        getchar();
    }
    j'obtiens se résulta dans la console:
    Tapez une phrase :
    bonjour
    Vous avez tape : 'bonjour'
    enfaite je voudrais que le mot en rouge n'apparaisse pas tout en gardant la phrases du dessus et qu'on est comme résulta:
    Tapez une phrase :
    Vous avez tape : 'bonjour'

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 117
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Oui il y a un moyen ... mais je ne le connais qu'avec la NCurses.
    Néanmoins, vous pouvez très bien le faire avec la WinAPI ... vous devez chercher un truc qui enlève l'echo...
    Ça doit être facile à trouve lorsque on sait que cela s'appelle l'echo
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    Sous UN*X c'aurait ete avec ioctl. Tu peux aussi tenter quelque chose avec des '\b'.

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Plutôt que d'effacer le premier message, pourquoi ne pas se dispenser de l'afficher la seconde fois ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    j'ai eu l'occasion récamment "d'essayer" de programmer avec ncurses.

    Pourrais-tu m'indiquer quelle partie de code permet cela ? Ou dans le tutoriel de howto.

    j'avais déjà essayer ça sans résulta (la saisi ne marchait même pas):
    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
    46
    47
    48
    49
    50
    #include <stdio.h>
    #include <stdlib.h>
    #include <curses.h>
    #include <panel.h>
    #include <string.h> 
     
    static void purger(void)
    {
        int c;
     
        while ((c = getchar()) != '\n' && c != EOF)
        {}
    }
     
    static void clean (char *chaine)
    {
        char *p = strchr(chaine, '\n');
     
        if (p)
        {
            *p = 0;
        }
     
        else
        {
            purger();
        }
    }
     
     
    int main(int argc, char *argv[])
    {
     
            initscr();			
    	raw();				
    	keypad(stdscr, TRUE);	
    	noecho();			
     
    char chaine[20];
     
        printf("Tapez une phrase : \n");
        fgets(chaine, sizeof chaine, stdin);
        clean(chaine);
        printf("Vous avez tape : %s", chaine);
        refresh();			
        getchar();
        endwin();		
     
    return 0;
    }
    sinon j'ai aussi chercher du côté de echo sur google et le forum sans vraiment trouver la solution au problème sans utiliser ncurses, pareille pour \b rien trouvé à quoi sers t-il d'ailleurs ?

    Plutôt que d'effacer le premier message, pourquoi ne pas se dispenser de l'afficher la seconde fois ?
    dans l'exemple simple que j'ai donnais oui je pourrais (en enlevant printf("Vous avez tape : '%s'", chaine);) mais dans mon chat non car la 2ème fois que je le reçois c'est par le serveur donc à moins que le serveur ne renvois pas le message au client qui l'a envoyer (que je ne sais pas faire encore) je suis obligé d'avoir recoure à une solution plus poussé.

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par AddicTion Voir le message
    dans l'exemple simple que j'ai donnais oui je pourrais (en enlevant printf("Vous avez tape : '%s'", chaine);) mais dans mon chat non car la 2ème fois que je le reçois c'est par le serveur donc à moins que le serveur ne renvois pas le message au client qui l'a envoyer (que je ne sais pas faire encore) je suis obligé d'avoir recoure à une solution plus poussé.
    Il y a certes la solution que le serveur ne renvoie pas le message au client qui l'a émis.

    Mais sinon, n'aurais-tu pas par hasard dans ton message l'identifiant du posteur (ce qui est quand même une fonctionnalité assez basique dans les chats afin de pouvoir afficher l'identité du posteur), dans ce cas il suffit d'afficher si et seulement si l'identifiant n'est pas le tien.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    Citation Envoyé par gl Voir le message
    Il y a certes la solution que le serveur ne renvoie pas le message au client qui l'a émis.

    Mais sinon, n'aurais-tu pas par hasard dans ton message l'identifiant du posteur (ce qui est quand même une fonctionnalité assez basique dans les chats afin de pouvoir afficher l'identité du posteur), dans ce cas il suffit d'afficher si et seulement si l'identifiant n'est pas le tien.
    hum...

    j'ai essayer de mettre la variable pseudo dans une structure et de la récupérer dans la fonction prévu mais ça ne marche pas

    dans mon thread j'ai déjà mis la variable "s" du serveur j'avais pensé mettre la variable du serveur + la variable du pseudo dans un structure puis la mettre en paramètre du thread mais je ne sais pas comment faire pour le thread.

    pthread_create(&thread, NULL, message, (struct *)&variante); ne marche pas

  8. #8
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
     
    #ifdef sun
    #include <stropts.h>
    #else
    #include <sys/ioctl.h>
    #endif
    #include <sys/termios.h>
    #include <string.h>
    #include <stdio.h>
     
    #ifdef __linux__
    #define TIOCGETA TCGETS
    #define TIOCSETA TCSETS
    #else
    #ifdef sun
    #define TIOCGETA TCGETA
    #define TIOCSETA TCSETA
    #endif
    #endif
     
    /*
    ** ioctl() recupere les attributs de la line discipline du term
    ** et permet de les modifier
    */
    int			init_termcps()
    {
      struct termios	t;
     
      //On recupere les attributs
      if (ioctl(0, TIOCGETA, &t) < 0)
        return (0);
     
      //On retire l'echo
      t.c_lflag &= ~ECHO;
     
      //On set les attributs
      if (ioctl(0, TIOCSETA, &t) < 0)
        return (0);
     
      return (1);
    }
     
    /*
    ** Ne pas oublier d'appeler cette fonction en fin
    ** de programme pour remettre l'echo.
    */
    int			revoke_termcps()
    {
      struct termios	t;
     
      if (ioctl(0, TIOCGETA, &t) < 0)
        return (0);
     
      t.c_lflag |= ECHO;
     
      if (ioctl(0, TIOCSETA, &t) < 0)
        return (0);
     
      return (1);
    }
     
    int			main()
    {
      char                  buffer[128];
     
      //On retire l'echo
      if (!init_termcps())
        return (1);
     
      //On lit la phrase
      if (fgets(buffer, sizeof(buffer) / sizeof(*buffer), stdin))
        {
          buffer[strlen(buffer) - 1] = 0;
          printf("You entered: '%s'\n", buffer);
        }
     
      //On remet l'echo
      if (!revoke_termcps())
        return (1);
     
      return (0);
     
    }
    Ce code retire le mode echo d'un input par stdin. Je ne sais pas s'il fonctionne sous windows (on va dire que non).

    EDIT: des commentaires.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    je pense avoir trouvé en faisant un sorte que lorsque je reçois un message avec le pseudo utilisé plus tot dans main ne pas afficher le message.

    donc je demande au début d'entrer un pseudo puis ensuite je part sur une autre fonction (grasse à un thread) mais la le pseudo choisi est perdu je voulais faire un pointeur de cette manière mais ça ne marchait pas

    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
     
    void* message(void* data);
     
     
    int main()
    ...
    char pseudo[20];
    int *Ppseudo = &pseudo;
    ...
     
    void* message(void* data)
    {
    ....
    else if(memcmp(buff, ("%s", *Ppseudo), 3) ==0)
       {
        printf("test");
        getchar();
       }
    ...
    }

Discussions similaires

  1. Effacer le contenu de la ligne de commande
    Par laurentze dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 02/06/2010, 17h56
  2. effacer définitivement l'historique de la commande exécuter
    Par williammalo dans le forum Windows XP
    Réponses: 1
    Dernier message: 01/11/2007, 21h23
  3. La commande delete dir n'efface pas ce que je veux
    Par DJ Caësar 9114 dans le forum ANT
    Réponses: 2
    Dernier message: 04/10/2007, 12h10
  4. Effacer une instruction dans la fenêtre de commandes
    Par jmbonnaz dans le forum MATLAB
    Réponses: 1
    Dernier message: 15/02/2007, 10h18
  5. 'Effacer' l'invite de commande
    Par damleg dans le forum Général Java
    Réponses: 4
    Dernier message: 12/04/2006, 13h25

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