Mon programme s’arrête automatiquement

Fermé
PokemonPika Messages postés 12 Date d'inscription mercredi 2 décembre 2015 Statut Membre Dernière intervention 29 juin 2018 - Modifié par baladur13 le 3/12/2015 à 11:05
PokemonPika Messages postés 12 Date d'inscription mercredi 2 décembre 2015 Statut Membre Dernière intervention 29 juin 2018 - 4 déc. 2015 à 18:45
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 :
/*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:

3 réponses

Utilisateur anonyme
2 déc. 2015 à 21:19
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.
0
PokemonPika Messages postés 12 Date d'inscription mercredi 2 décembre 2015 Statut Membre Dernière intervention 29 juin 2018 1
3 déc. 2015 à 11:03
Bonjour et merci pour ta réponse. Comment changer le code source afin que le programme ne s'éteigne pas dans ce cas ?

Et merci du conseil pour la coloration.
0
Utilisateur anonyme
3 déc. 2015 à 12:00
Je ne connais pas le c, mais de la même façon que tu as déjà demandé une saisie.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié par [Dal] le 3/12/2015 à 16:23
par exemple en ajoutant
getchar()
avant la fin de ta fonction
main()
, mais cela ne fonctionnera à coup sûr que s'il n'y a rien dans le tampon stdin.

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 à
getchar()
.

Il faudrait vider le tampon de stdin, si le dernier caractère récupéré par
fgets()
n'est pas
'\n'
.


Dal
0
PokemonPika Messages postés 12 Date d'inscription mercredi 2 décembre 2015 Statut Membre Dernière intervention 29 juin 2018 1
3 déc. 2015 à 19:07
Bonsoir Dal, merci en rajoutant getchar ça marche !!!
Est-il possible de remplacer
buffer[80]
en quelque chose comme
buffer[+infini]
? Désolé si ce que je dis est une énormité ...
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
3 déc. 2015 à 19:31
Non, ce n'est pas possible. Par ailleurs, ta mémoire n'est pas infinie.

En C99, tu peux en revanche faire quelque chose des déclarations comme
char buffer[n];
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
realloc()
).

Ou en simple C89, une allocation dynamique avec des pointeurs sur char et
malloc()
, et une réallocation possible avec
realloc()
, 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
free()
.

Dal
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
2 déc. 2015 à 21:30
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@@
'
0
PokemonPika Messages postés 12 Date d'inscription mercredi 2 décembre 2015 Statut Membre Dernière intervention 29 juin 2018 1
3 déc. 2015 à 10:58
Bonjour, et merci pour ta réponse. Je l'ai exécuté effectivement sans problème avec l'invite de commande. Cependant j'ai aussi essayé de le compiler avec gcc (sous windows) et ça ne fonctionne toujours pas.
Qu'as-tu modifié dans le code du programme ?
Merci encore
0
mtR^ Messages postés 1211 Date d'inscription vendredi 17 juin 2011 Statut Membre Dernière intervention 3 juin 2023 169
3 déc. 2015 à 16:28
Salut,

Rajoute system("PAUSE"); à la fin de ton main
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié par [Dal] le 3/12/2015 à 16:34
cela ne fonctionnera pas sous Linux (ce n'est pas portable) ... je ne suis sûr s'il est sous Linux ou Windows vu qu'il dit utiliser Geany et/ou wxDev-c++.
0
PokemonPika Messages postés 12 Date d'inscription mercredi 2 décembre 2015 Statut Membre Dernière intervention 29 juin 2018 1
3 déc. 2015 à 18:52
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...
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié par [Dal] le 3/12/2015 à 19:01
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++.
0
PokemonPika Messages postés 12 Date d'inscription mercredi 2 décembre 2015 Statut Membre Dernière intervention 29 juin 2018 1
3 déc. 2015 à 19:11
Ouf, voilà qui me facilitera la chose à l'avenir. Merci, on m'avait justement déjà conseillé cette bibliothèques.
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
4 déc. 2015 à 13:54
#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;
}
0