Mon programme s’arrête automatiquement
PokemonPika
Messages postés
12
Date d'inscription
Statut
Membre
Dernière intervention
-
PokemonPika Messages postés 12 Date d'inscription Statut Membre Dernière intervention -
PokemonPika Messages postés 12 Date d'inscription Statut Membre Dernière intervention -
Bonjour a tous, je me permet de vous écrire suite à un problème récurrent que je rencontre et qui m'empêche de progresser correctement !
J'étudie le langage C, je tape mon code, je compile, jusque là tout va bien seulement lorsque je lance le .exe que j'ai au final, le programme se lance, mais il s’arrête juste après qu'il ai finit de travailler !!! Automatiquement, si bien que je ne peux même pas voir le résultat !! C'est très embêtant...
Pour l'écrire j'utilise Geany, pour le compiler wxDev-c++.
Voici le code source :
Auriez vous une solution ?? A inclure dans le code lui même ou plus dans le logiciel de compilation ?
J'aimerais que le programme ne s’arrête pas automatiquement pour que je puisse voir le résultat...
J'étudie le langage C, je tape mon code, je compile, jusque là tout va bien seulement lorsque je lance le .exe que j'ai au final, le programme se lance, mais il s’arrête juste après qu'il ai finit de travailler !!! Automatiquement, si bien que je ne peux même pas voir le résultat !! C'est très embêtant...
Pour l'écrire j'utilise Geany, pour le compiler wxDev-c++.
Voici le code source :
/*Debut du programme*/ /* perroquet.c : ce programme répète ce qu'il vient de lire au clavier*/ #include <stdlib.h> #include <stdio.h> int lire_clavier(char *str, int taille) { int i; fgets(str, taille, stdin); str[taille-1]='\0'; for(i=0; str[i]; i++) /*supprime le retour chariot*/ { if(str[i] == '\n') { str[i] = '\0'; break; } } return(i); /*Renvoie 0 si la chaine est vide*/ } int main() { char buffer[80]; printf("Entrez une ligne et validez avec Entrée\n"); lire_clavier(buffer, sizeof(buffer)); printf("Vous avez écrit : '%s'\n", buffer); } /*Fin du programme*/
Auriez vous une solution ?? A inclure dans le code lui même ou plus dans le logiciel de compilation ?
J'aimerais que le programme ne s’arrête pas automatiquement pour que je puisse voir le résultat...
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
A voir également:
- Mon programme s’arrête automatiquement
- Programme demarrage windows - Guide
- Comment lancer un programme automatiquement au démarrage de windows - Guide
- Message programmé iphone - Guide
- Mettre en veille un programme - Guide
- Programme word gratuit - Guide
3 réponses
Bonsoir, c'est un classique du programme en mode console.
Si tu termines ton programme par une demande de saisie clavier alors il s'arrêtera après que tu aies tapé quelque chose.
A l'avenir pour poster tes codes, utilise la la coloration syntaxique.
Si tu termines ton programme par une demande de saisie clavier alors il s'arrêtera après que tu aies tapé quelque chose.
A l'avenir pour poster tes codes, utilise la la coloration syntaxique.
Comment lances-tu ton exécutable?
Lance le depuis un terminal (cmd.exe), en supposant que tu sois sous Win$.
Ton code compile et s'exécute sans problème sous gcc
(après quelques corrections mineures du source)
johand@bata:~/src/CCM$ gcc-4.8 -Wall -o unexp_end unexp_end.c
johand@bata:~/src/CCM$ gcc-5 -Wall -o unexp_end unexp_end.c
johand@bata:~/src/CCM$ ./unexp_end
Entrez une ligne et validez avec Entrée
toto titi@@
Vous avez écrit : 'toto titi@@'
Lance le depuis un terminal (cmd.exe), en supposant que tu sois sous Win$.
Ton code compile et s'exécute sans problème sous gcc
(après quelques corrections mineures du source)
johand@bata:~/src/CCM$ gcc-4.8 -Wall -o unexp_end unexp_end.c
johand@bata:~/src/CCM$ gcc-5 -Wall -o unexp_end unexp_end.c
johand@bata:~/src/CCM$ ./unexp_end
Entrez une ligne et validez avec Entrée
toto titi@@
Vous avez écrit : 'toto titi@@'
Salut,
Rajoute system("PAUSE"); à la fin de ton main
Rajoute system("PAUSE"); à la fin de ton main
Merci pour ta réponse !
En réponse à Dal, je suis sur Windows. Mais effectivement je souhaite que les programmes soient portables.
Petite question, si je souhaite créer une interface graphique pour le programme, y aura-t-il encore ce problème de fermeture ? Je n'en suis pas encore là dans mon apprentissage, mais si, arrivé à la création de l'interface, je n'ai plus ce problème, je ne vais pas chercher plus longtemps et plutôt utiliser la méthode de l'invite de commande proposé par jisisv...
En réponse à Dal, je suis sur Windows. Mais effectivement je souhaite que les programmes soient portables.
Petite question, si je souhaite créer une interface graphique pour le programme, y aura-t-il encore ce problème de fermeture ? Je n'en suis pas encore là dans mon apprentissage, mais si, arrivé à la création de l'interface, je n'ai plus ce problème, je ne vais pas chercher plus longtemps et plutôt utiliser la méthode de l'invite de commande proposé par jisisv...
Non, tu n'auras normalement pas ce problème, les programmes en interface graphique utilisateur (GUI) fonctionnant en boucle en attente d'événements.
Par contre, faire un programme GUI portable est une autre difficulté. Tu as intérêt à utiliser des bibliothèques telles que wxWidgets, dont l'accès devrait être facilité par wxDev-c++.
Par contre, faire un programme GUI portable est une autre difficulté. Tu as intérêt à utiliser des bibliothèques telles que wxWidgets, dont l'accès devrait être facilité par wxDev-c++.
#include <stdlib.h> #include <stdio.h> int lire_clavier(char *str, int taille) { int i; fgets(str, taille, stdin); str[taille-1]='\0'; for(i=0; str[i]; i++) /*supprime le retour chariot*/ { if(str[i] == '\n') { str[i] = '\0'; break; } } return(i); /*Renvoie 0 si la chaine est vide*/ } int main(int argc, char *argv[]) { char buffer[80]; printf("Entrez une ligne et validez avec Entrée\n"); lire_clavier(buffer, sizeof(buffer)); printf("Vous avez écrit : '%s'\n", buffer); return EXIT_SUCCESS; }
Et merci du conseil pour la coloration.
en clair, si l'utilisateur tape plus que ce que fgets va demander (la taille de la saisie consommée par fgets est limitée à 80 char dans ce code), il restera des caractères à récupérer dans stdin qui seront consommés lors de prochains appels à .
Il faudrait vider le tampon de stdin, si le dernier caractère récupéré par n'est pas .
Dal
Est-il possible de remplacer en quelque chose comme ? Désolé si ce que je dis est une énormité ...
En C99, tu peux en revanche faire quelque chose des déclarations comme avec une valeur de n dans une variable pouvant être traitée par le programme avant la déclaration du tableau... avec le problème que tu n'as pas vraiment de possibilité de détecter une erreur d'allocation de mémoire (ni de faire un ).
Ou en simple C89, une allocation dynamique avec des pointeurs sur char et , et une réallocation possible avec , qui te permet d'augmenter la mémoire allouée à ton tampon en cours d'exécution si la mémoire disponible le permet ... il ne faudra pas oublier de libérer la mémoire avec .
Dal