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 :

Message avant la boucle while(1)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut Message avant la boucle while(1)
    Bonjour a tous,

    Question facile :
    J'aimerai creer un programme qui lorsqu'on appuie sur 's', une fonction se lance dans une , lorqu'on appuie sur 'q' on quitte la boucle et sinon lorsque la lettre est differente, la fonction renvoie le message "veuillez reessayer" et la boucle redemarre

    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
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    #include "unicast_socket_sendto.h"
     
    int main(void) {
     
    	puts("!!!test 7!!!"); /* prints !!!Hello World!!! */
    	char *dest_ip = "127.0.0.1";
    	char *message = "hello";
    	int port = 7;
     
    	printf("Tape a letter S or Q:");
    	while (1){
     
    		char c = getchar();
     
    		if ((c=='s')||(c=='S'))
    		{
    			printf("Message sent: %s\n", message);
    			unicast_socket_sendto(port, dest_ip, message);
    			system("BREAK");
    			return EXIT_SUCCESS;
    		}
    		else if ((c=='q')||(c=='Q'))
    		{
    			printf("QUIT\n");
    			break;
    		}
    		else {
    			printf("Invalid key, tape 'S' to send a message, 'Q' to exit");
    				}
    	}
     
    }
    Dans mon programme, j aimerai que le message "Tape a letter S or Q" apparaisse avant de rentrer la lettre, or ce n est pas le cas, et reapparraisse pour la derniere condition. Pouvez vous m'aider svp

    Merci pour vos reponses

    Bien a vous,

    Beaug.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2013
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 120
    Par défaut
    Mais en commentaire puts("!!!test 7!!!"); /* prints !!!Hello World!!! */
    ou simplement remplace la fonction puts par printf

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par beau_g Voir le message
    j aimerai que le message "Tape a letter S or Q" apparaisse avant de rentrer la lettre, or ce n est pas le cas
    Rajoute fflush(stdout) juste en dessous de ton printf("Tape a letter S or Q:").

    Citation Envoyé par beau_g Voir le message
    et reapparraisse pour la derniere condition.
    Là je ne pige pas. Mais si tu veux que ton message "Tape a letter S or Q" soit affiché à chaque itération, il te faut alors le mettre dans le while.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Pour compléter la réponse de Sve@r, il est courant que printf soit implémenté avec une mémoire tampon.
    Cette mémoire tampon n'est transmise à l'écran que lorsqu'elle est suffisamment remplie, ou bien si on demande explicitement que le transfert ait lieu.
    Pour ce dernier cas, il y a effectivement la fonction fflush, mais généralement un retour à la ligne fait l'affaire.

    Donc tu peux essayer de te passer de fflush en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Tape a letter S or Q:\r\n");

  5. #5
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Accessoirement, suivant le contexte, "tape" en anglais signifie "scotcher" ou "enregistrer sur cassette"...
    Je pense que tu voulais dire "hit" or "push" !

  6. #6
    Membre averti Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut
    Bonjour à tous,

    Merci pour vos réponses, ça marche comme je voudrai maintenant !

    Sauf un détail lorsque la dernière condition est activée, le programme boucle 2 fois...

    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
    include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    #include "unicast_socket_sendto.h"
     
     
     
    void *send_uni(void *arg)
    	{
    	char *dest_ip = "127.0.0.1";
    	char *message = "hello";
    	int port = 7;
     
     
    	while (1)
    	{
     
    		printf("Push a letter S or Q:\r\n ");
    		char c = getchar();
     
    		if ((c=='s')||(c=='S'))
    		{
    			printf("Message sent: %s\n", message);
    			unicast_socket_sendto(port, dest_ip, message);
    			system("BREAK");
    			return EXIT_SUCCESS;
    		}
    		else if ((c=='q')||(c=='Q'))
    		{
    			printf("QUIT");
    			break;
    		}
    		else
    		{
    			printf("Invalid key, tape 'S' to send a message, 'Q' to exit.");
    		}
    	}
     
    	return NULL;
    }
     
     
    int main(void)
    {
    	/* this variable is our reference to the second thread */
    	pthread_t thread;
     
    	/* create a second thread which executes send_uni(void *arg) */
     
    	if(pthread_create(&thread, NULL, send_uni, NULL)) {
    		fprintf(stderr, "Error creating thread\n");
    		return 1;
    	}
     
    	/* wait for the second thread to finish */
    	if(pthread_join(thread, NULL)) {
    		fprintf(stderr, "Error joining thread\n");
    		return 2;
    	}
    	return 0;
    }
    Le message voulu apparait donc 2 fois

    Nom : Capture.PNG
Affichages : 243
Taille : 3,6 Ko

    Aussi, je ne sais pas si le problème viens de mon ordinateur ou de mon programme, mais lorsque je ''run'' le programme sur eclypse IDE, mon PC crash avec "Ecran bleu"...ça me rend fou ^^'
    Cela vous est déjà arrivé ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est parce que tu tapes deux caractères: La lettre 'g', et la touche Entrée ('\n').
    Ce qui t'intéresse, c'est le premier caractère de la ligne tapée au clavier; tu peux donc utiliser cette fonction après ton getchar():
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /*Returns 0 if OK, a negative value if EOF.*/
    int fpurge(FILE *f)
    {
    	int c;
    	while((c=fgetc(f))!=EOF && c!='\n')
    	{ }
    	return (c==EOF ? -1 : 0);
    }

    Employée ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		char c = getchar();
    		fpurge(stdin);
    Cela prendra le premier caractère de la ligne dans la variable c, puis fera passer tous les caractère suivants de la même ligne (y compris le '\n') à la trappe.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  2. Boucle while & read
    Par gibet_b dans le forum Linux
    Réponses: 4
    Dernier message: 29/04/2005, 15h38
  3. boucle while et post incrémentation
    Par tut dans le forum C++
    Réponses: 7
    Dernier message: 10/12/2004, 17h24
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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