Application bloquée sur un scanf

Résolu
33cl Messages postés 2 Date d'inscription vendredi 3 mai 2019 Statut Membre Dernière intervention 19 mai 2019 - Modifié le 5 mai 2019 à 13:07
33cl Messages postés 2 Date d'inscription vendredi 3 mai 2019 Statut Membre Dernière intervention 19 mai 2019 - 19 mai 2019 à 15:42
Salut à tous ! je suis débutant en programmation et voici la fonction qui "deconne":

int i_alerte, nombre_zombies, i2_zombie, decision_Rick, suicide, mort = 0;

        if(nombre_zombies > 15){
        printf("Non! Rick!\n");
        Sleep(2000);
        printf("Votre ami s'est disperse par inadvertance et se retrouve seul entoure de la horde. Que faire??\n");
        printf("1 : essayer coute que coute de sauver risquant votre propre vie.\n2 : rester en retrait car c'est de sa faute et qu'il y a peu de chance vous reussissiez a le sauver\n\t");
        scanf("%d\n", &decision_Rick);

        //decision a prendre pour sauver rick ou pas (en cours)
        if(decision_Rick == 1){

            printf("vous tentez de voler au secours de votre ami. Sa vie depend de vous !\n");
            printf("il est toujours en vie il faut pas abandonner!\n");
            printf("allez vous reussir?\n");
            Sleep(3000);
            printf("*un zombie s'accroche a votre jambe*\n");
            Sleep(300);
            printf("*il vous la devore*\nvoulez vous en finir une bonne fois pour toute et vous tirer une balle ou vous preferez attendre patiement la mort?\n");
            scanf("1 : se suicider\n 2 : attendre que la mort survienne\n [%d]", &suicide);


le problème c'est que ma console me fait patienter infiniment après le scanf("%d\n", &decision_Rick);

programme complet
#include <stdio.h>
#include <windows.h>

int main (){

    //activer le mode plain écran avec la fonction ci-dessous
    {

            typedef BOOL (WINAPI *PFONCTION) (HANDLE,DWORD,PCOORD);
        HMODULE hDLL=LoadLibrary("kernel32.dll");
        PFONCTION SetDisplayMode = (PFONCTION) GetProcAddress(hDLL,"SetConsoleDisplayMode");
        HANDLE hconsole = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD coord;
        SetDisplayMode (hconsole,1,&coord);
    }

    //déclaration des variables
    int i_alerte, nombre_zombies, i2_zombie, decision_Rick, suicide, mort = 0;

    //intro
    printf("*vous etes dans un monde rempli de zombie et vous patrouillez avec votre ami, Rick, pour votre camp qui est le dernier restant sur terre*\n\n");
    Sleep(5000);

    //Message d'alerte
    for(i_alerte = 0; i_alerte < 35 ; i_alerte++){
        printf("!!!ALERTE!!! HORDE DE ZOMBIES IMMINENTE!\n");
    }
    //nombre de zombies vu par l'utilisateur
    printf("\n\n");
    printf("Combien de zombies vois-tu?\t");
    scanf("%d", &i2_zombie);

    nombre_zombies = i2_zombie;

    //affrontement
    while(i2_zombie > 0){
        Sleep(250);

        printf("*affrontement*\n");

        Sleep(450);

        printf("ZOMBIE ELIMINE\n\n");


        i2_zombie--;

    }

    //résultats de l'affrontemment (en cours)
    //perte de rick dans l'histoire
    if(nombre_zombies > 15){
        printf("Non! Rick!\n");
        Sleep(2000);
        printf("Votre ami s'est disperse par inadvertance et se retrouve seul entoure de la horde. Que faire??\n");
        printf("1 : essayer coute que coute de sauver risquant votre propre vie.\n2 : rester en retrait car c'est de sa faute et qu'il y a peu de chance vous reussissiez a le sauver\n\t");
        scanf("%d\n", &decision_Rick);

        //decision a prendre pour sauver rick ou pas (en cours)
        if(decision_Rick == 1){

            printf("vous tentez de voler au secours de votre ami. Sa vie depend de vous !\n");
            printf("il est toujours en vie il faut pas abandonner!\n");
            printf("allez vous reussir?\n");
            Sleep(3000);
            printf("*un zombie s'accroche a votre jambe*\n");
            Sleep(300);
            printf("*il vous la devore*\nvoulez vous en finir une bonne fois pour toute et vous tirer une balle ou vous preferez attendre patiement la mort?\n");
            scanf("1 : se suicider\n 2 : attendre que la mort survienne\n [%d]", &suicide);

            //choisir le suicide ou pas
            switch(suicide){

                case 1:
                    printf("vous en avez fini avec ce monde...\n\n");
                    mort = 1;
                    break;

                default:
                    printf("vous preferez garder votre digniter! jamais de la vie ces ordures ne vous tueront !\n\n");
                    Sleep(3000);
                    printf("cependant vous vous sentez faibles..\n");
                    Sleep(2000);
                    printf("vous commencez lentement a partir..\n");
                    Sleep(2500);
                    printf("c'est de plus en plus dur de tenir..\n");
                    Sleep(5000);
                    printf("il en est fini de vous...\n\n");
                    mort = 1;
                    break;

                    }

        }
        else if(decision_Rick == 0)
        {   //ne pas le sauver (en cours)
            printf("vous voyez votre ami, egalement un des derniers survivants se faire devorer...\n");
            Sleep(4000);
            printf("ronge par la tritesse et la haine, vous vous devez d'accomplir cette tache et de finir cette mission\n\n *affrontement*\n ZOMBIE ELIMINE\n\n");
            scanf("appuyez sur [entree] pour continuer\n");


            }
        else{
            printf("***UNE ERREUR EST SURVENUE***");
        }

    }
    if(mort == 0){
        if(nombre_zombies < 25 && nombre_zombies >= 15){
            printf("BRAVO ! malgrez les pertes engendrees par cela, vous avez sauve notre pays !");
        }
        else if(nombre_zombies <= 15 && nombre_zombies > 5){
            printf("Pas mal ! vous avez abattu une horde de %d zombies !", nombre_zombies);
        }
        else if(nombre_zombies <= 5 && nombre_zombies > 0){
            printf("je ne pense pas que vous ayez ete un element moteur dans la destruction de ses zombies, mais vous en avez tout de meme tue %d", nombre_zombies);
        }
        else if(nombre_zombies > 25 && mort == 0){
            printf("BRAVO !! VOUS ETES UN VERITABLE HEROS L'HUMANITE ET VOUS AVEZ SU PRENDRE LES BONNES\n DECISIONS MALGRES CE QU'ELLES ENGENDRAIENT...");
            Sleep(15000);
            printf("Cependant, vous vous sentez tres mal\n\n *vous examinez votre corps*\n vous remarquez une enorme morsure sur votre bras");
            Sleep(500);
            printf("*vous sentez votre corps leger meme si vous ne pouvez plus le bouger*");
            Sleep(400);
            printf("*c'est bon vous le sentez;*");
            Sleep(300);
            printf("*vous partez...");
            Sleep(350);
            printf("*regrets, amour pour vos proches mais surtout fierte et espoir pour les autres sommeillent dans votre esprit et sommeilleront dans ce dernier a jamais..*\n");
            printf("*vous n'etes desormais plus qu'une ame errante..*\n\n");
            mort = 1;
        }
        else if(nombre_zombies == 0){
            printf("dommage... j'aurai aime me battre !");
        }
        else{
            printf("***UNE ERREUR EST SURVENUE***assurez vous de n'avoir utilise seulement des nombres entiers positifs ");
        }
    }
    else if(mort == 0 && nombre_zombies > 0){
         printf("***UNE ERREUR EST SURVENUE***assurez vous de ne pas avoir utilise de valeur decimale, de lettres ou de caracteres speciaux ");
        }


    return 0;
}

3 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 5 mai 2019 à 12:03
Bonjour.

Ton scanf ne doit pas avoir autre chose que le format dedans (pas de texte, donc pas de \n non plus). Donc tu dois avoir quelque chose comme:
printf("mon texte blabla");
scanf("%d", &ma_var);


Ne pas confondre scanf et printf. Printf affiche, scanf essaie de lire le format que tu lui donnes. Donc si tu donnes "toto %d", il faudra que l'utilisateur tape: "toto 34" pour récupérer la valeur 34.

1
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 20 mai 2019 à 11:39
La même chose que ce que tu as fait, mais en plus "propre".
Compatible avec toutes les versions du C.
Compatible Linux, Mac, Windows, etc... (Et pas seulement Windows).
Gère les entrées interdites (entre un texte quand on te demande un nombre dans ton programme, et tu verras que ça se passe mal).
Pas de sleep (super chiant d'attendre pour rien). Erreur classique de se dire: donnons l'information petit à petit, c'est trop classe. En fait, non, ça fait chier l'utilisateur au bout de 10 secondes :p.
Pas besoin de faire 50 printfs, tu peux faire un printf de plusieurs lignes.
"Quelques" corrections orthographiques ;).

Le code:
#include <stdio.h>

int choice(int from, int to)
{
  int n = -1;
  while (n < from || n > to)
  {
    scanf("%d", &n);
    /* Nettoyer le buffer si on entre une chaîne de caractères
       au lieu d'un entier */
    while (getchar() != '\n')
      ;
    if (n < from || n > to)
    {
      printf("Choix %d invalide.\nEntrez un choix valide:\t", n);
    }
  }

  return n;
}

void pause(void)
{
  char dummy = 0;
  printf("Appuyez sur [entrée] pour continuer\n");
  while (dummy != EOF && dummy != '\n')
    dummy = getchar();
}

int main(void)
{
  int i, nombre_zombies, zombies_restants, mort = 0;

  printf("*Vous êtes dans un monde rempli de zombies et vous patrouillez avec "
         "votre ami, Rick, pour votre camp qui est le dernier restant sur "
         "terre*\n\n");

  /* Message d'alerte */
  for (i = 0; i < 35; ++i)
    printf("!!!ALERTE!!! HORDE DE ZOMBIES IMMINENTE!\n");

  /* Nombre de zombies vu par l'utilisateur */
  printf("\n\nCombien de zombies vois-tu?\t");
  nombre_zombies = choice(0, 100);
  zombies_restants = nombre_zombies;

  /* Affrontement */
  while (zombies_restants > 0)
  {
    printf("*affrontement*\n"
           "ZOMBIE ELIMINE\n\n");
    --zombies_restants;
  }

  /* Résultat de l'affrontemment (en cours)
     Perte de rick dans l'histoire */
  if (nombre_zombies > 15)
  {
    printf("Non! Rick!\n"
           "Votre ami s'est dispersé par inadvertance et se retrouve seul "
           "entouré de la horde. Que faire??\n"
           "1 : essayer coûte que coûte de le sauver risquant votre propre vie.\n"
           "2 : rester en retrait car c'est de sa faute et qu'il y a peu de "
           "chance vous réussissiez à le sauver\n");

    /* Décision à prendre pour sauver Rick ou pas (en cours) */
    switch (choice(1, 2))
    {
      case 1:
        printf("Vous tentez de voler au secours de votre ami. Sa vie dépend de "
               "vous !\n"
               "Il est toujours en vie il ne faut pas abandonner!\n"
               "Allez vous réussir?\n"
               "*Un zombie s'accroche à votre jambe*\n"
               "*Il vous la dévore*\n"
               "Voulez-vous en finir une bonne fois pour toute et vous tirer "
               "une balle, ou préférez-vous attendre patiemment la mort?\n"
               " 1 : se suicider\n"
               " 2 : attendre que la mort survienne\n");

        /* Choisir le suicide ou non */
        switch (choice(1, 2))
        {
          case 1:
            printf("Vous en avez fini avec ce monde...\n\n");
            mort = 1;
            break;

          case 2:
            printf("Vous préférez garder votre dignité ! Jamais de la vie ces "
                   "ordures ne vous tueront !\n\n"
                   "Cependant vous vous sentez faible..\n"
                   "ovus commencez lentement à partir..\n"
                   "C'est de plus en plus dur de tenir..\n"
                   "C'en est fini de vous...\n\n");
            mort = 1;
            break;
        }
        break;
      case 2:
          /* Ne pas le sauver (en cours) */
          printf("Vous voyez votre ami, également un des derniers survivants "
                 "se faire dévorer...\n"
                 "Rongé par la tristesse et la haine, vous vous devez "
                 "d'accomplir cette tâche et de finir cette mission\n\n"
                 " *affrontement*\n"
                 " ZOMBIE ELIMINE\n\n");
        pause();
        break;
    }
  }

  if (mort == 0)
  {
    if (nombre_zombies == 0)
      printf("Dommage... J'aurais aimé me battre !\n");
    else if (nombre_zombies <= 5)
      printf("Je ne pense pas que vous ayez été un élément moteur dans la "
             "destruction de ces zombies, mais vous en avez tout de même "
             "tué %d\n", nombre_zombies);
    else if (nombre_zombies <= 15)
      printf("Pas mal ! Vous avez abattu une horde de %d zombies !\n", nombre_zombies);
    else if (nombre_zombies <= 25)
      printf("BRAVO ! Malgré les pertes engendrées par cela, vous avez sauvé notre pays !\n");
    else
    {
      printf("BRAVO !! VOUS ETES UN VERITABLE HEROS L'HUMANITE ET VOUS, AVEZ "
             "SU PRENDRE LES BONNES DECISIONS MALGRE CE QU'ELLES ENGENDRAIENT...\n"
             "Cependant, vous vous sentez très mal\n\n"
             "*Vous examinez votre corps*\n"
             "Vous remarquez une énorme morsure sur votre bras\n"
             "*Vous sentez votre corps léger même si vous ne pouvez plus le bouger*\n"
             "*C'est bon vous le sentez*\n"
             "*Vous partez...\n"
             "*Regrets, amour pour vos proches mais surtout fierté et espoir pour les"
             " autres sommeillent dans votre esprit et sommeilleront dans ce dernier"
             " à jamais..*\n"
             "*Vous n'êtes désormais plus qu'une âme errante..*\n\n");
      mort = 1;
    }
  }

  if (mort == 1)
    printf("Vous êtes mort.\n");

  return 0;
}


1
33cl Messages postés 2 Date d'inscription vendredi 3 mai 2019 Statut Membre Dernière intervention 19 mai 2019
19 mai 2019 à 15:42
merci à tous !
0
Rejoignez-nous