2015-05-15 5 views
0

Я новичок в C и получил крах моей программы, когда она доходит до конца.scanf сбой программы и сравнение строки C

Это мини-игра, в которой пользователь должен угадать номер. Когда он будет найден, программа спросит пользователя, хочет ли он играть в новую игру.

Пожалуйста найти мой код ниже:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 

int main() { 
int MAX = 100, MIN = 0; 
int nombreCoup = 0; 
int nombreMystere = 0; 
int nombreJoueur; 
char newPartie; 
int continuerPartie = 0; 
int niveauDiffic; 

srand(time(NULL)); 
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN; 

printf("Bonjour, ceci est un mini jeu dans lequel vous allez devoir deviner un nombre choisi aleatoirement entre 0 et 100.:\n"); 

while (continuerPartie = 1) 
{ 

    printf("Choisissez votre niveau de difficulte entre 1 et 3 :\n"); 
    scanf("%d", &niveauDiffic); 

    switch (niveauDiffic) 
    { 
     case 1: 
      printf("Vous avez selectionne la difficulte Facile. Le jeu commence.\n"); 
      break; 
     case 2: 
      printf("Vous avez selectionne la difficulte Normale. Le jeu commence.\n"); 
      niveauDiffic = 2; 
      MAX = 1000; 
      break; 
     case 3: 
      printf("Vous avez selectionne la difficulte Difficile. Le jeu commence.\n"); 
      niveauDiffic = 3; 
      MAX = 10000; 
      break; 
     default: 
      printf("Mauvaise entrée, la difficulte sera donc reglee sur Facile. \n"); 
      break;   
    } 


    printf ("\n On y va : \n"); 
    scanf ("%d", &nombreJoueur); 
    nombreCoup++; 

    do { 
     if (nombreJoueur > nombreMystere) { 
      printf ("Le nombre mystere est plus petit !\n"); 
      nombreCoup = nombreCoup + 1 ; 
      printf("Retente ta chance ! \n \n"); 
      scanf ("%d", &nombreJoueur); 
     } 

     else { 
      printf ("Le nombre mystere est plus grand ! \n"); 
      nombreCoup = nombreCoup + 1 ; 
      printf("Retente ta chance ! \n \n"); 
      scanf ("%d", &nombreJoueur);  
     } 


    } while (nombreJoueur != nombreMystere); 

    printf ("Vous avez trouver le nombre mystere en %d coups ! \nVoulez vous rejouer ? (Y/N) ", nombreCoup); 
    scanf("%1c", &newPartie); 
    printf ("%c", newPartie); 

    if (strcmp(newPartie, "Y" == 0)|| strcmp(newPartie, "y" == 0)) 
    { 
     printf ("Et c'est reparti !!'"); 
     } 

    else { 
     continuerPartie = 0; 
     } 

} 
return 0; 
} 

Проблема заключается в том, что программа падает на последнем scanf(). Я также получил это предупреждение при компиляции:

«передавая аргумент 1 из„“STRCMP делает указатель из целого числа без броска»

, но мне не удалось избавиться от него.

EDIT:

Спасибо за вашу помощь ПЕРЦЫ, похоже, что я должен получить больше внимания на мой синтаксис ... Теперь мой код не врезаться, я применил поправки. Единственная оставшаяся проблема заключается в том, что этот код:

printf ("Vous avez trouver le nombre mystere en %d coups ! \nVoulez vous rejouer ? (Y/N) ", nombreCoup); 
scanf("%1c", &newPartie); 
printf ("%c", newPartie); 

if ((newPartie == 'Y') || newPartie == 'y') 
{ 
    printf ("Et c'est reparti !!'"); 
    } 

else { 
    continuerPartie = 0; 
    } 

не выполняется ... Я не знаю, почему, но он закрывается после последнего Printf до если ..

EDIT 2:

Вот решение, благодаря @Sourav Гоша

ли вы попробовать зсапЕ ("% 1c", & newPartie);?, ум пространство перед тем%. - Сурав Гош.

+1

'newPartie' является' 'char'.Use, если ('Y' newPartie ==) || newPartie == 'y') 'вместо' if (strcmp (newPartie, "Y" == 0) || strcmp (newPartie, "y" == 0)) '. 'strcmp' требует, чтобы оба его аргумента были типа' char * ', и оба они должны быть NUL-завершены. Кроме того, используйте 'while (continuerPartie == 1)' вместо 'while (continuerPartie = 1)'. Первый сравнивает 'continuerPartie' с 1, а последний присваивает ему 1 (что делает его бесконечным циклом, поскольку 1 - - нулевое число и все ненулевые числа считаются истинными) и изменить 'int continuerPartie = 0;' на 'int continuerPartie = 1;' для выполнения цикла. –

ответ

1

Направьте 1

В коде

while (continuerPartie = 1) 

не делать то, что вы думаете, что он делает. Возможно, вы хотели использовать вместо этого оператор равенства (==). В противном случае это бесконечный цикл.

Тем не менее, вы должны инициализировать continuerPartie к 1 isntead из 0 для обеспечения цикла while() является satified в первой итерации.

Пункт 2

strcmp(newPartie, "Y" == 0) 

не правильное использование.

Либо использовать

  • strncmp() с &newPartie и n в 1, или (не очень хороший подход)
  • (лучше) использовать простой оператор равенства == как if ((newPartie=='Y')|| (newPartie=='y'))

Кроме того, == сравнение равенства в strcmp()/strncmp() должен выглядеть strncmp(a,b,c) == 0

Пункт 3

Изменить

scanf("%1c", &newPartie); 

в

scanf(" %1c", &newPartie); 

игнорировать предыдущую строку хранящуюся во входном буфереи сканирование символ без пробелов.

2

Есть несколько ошибок в программе:

while (continuerPartie = 1) 

Он постоянно присваивает continuerPartie значение 1.

Изменить это:

while (continuerPartie == 1) 

Кроме того, newPartie является голец, не строка.

if (strcmp(newPartie, "Y" == 0)|| strcmp(newPartie, "y" == 0)) 

должно быть:

if ((newPartie=='Y')|| (newPartie=='y')) 
Смежные вопросы