繁体   English   中英

scanf使程序崩溃并比较字符串C

[英]scanf crashes program and comparing string C

我是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()崩溃。 编译时我也得到了这个警告:

“传递'strcmp'的参数1使指针从整数开始而无需强制转换”

但是我没有摆脱它。

编辑:

感谢Guyz的帮助,看来我必须更加专注于语法...现在我的代码没有崩溃,我已经应用了更正。 唯一剩下的问题是该代码:

    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;
    }

没有执行...我不知道为什么,但是它在if ..之前的最后一个printf之后关闭。

编辑2:

这是解决方案,感谢@Sourav Gosh

您是否尝试过scanf(“%1c”,&newPartie);?,请注意%之前的空格 – Sourav Ghosh。

您的程序中有几个错误:

while (continuerPartie = 1)

它会连续为continuerPartie分配值1。

更改为:

while (continuerPartie == 1)

另外, newPartie是一个字符,而不是字符串。

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

应该:

   if ((newPartie=='Y')|| (newPartie=='y'))

点1

在您的代码中

while (continuerPartie = 1)

没有按照自己的想法去做。 也许您想使用相等运算符== )。 否则,这是一个无限循环。

就是说,您应该将continuerPartie初始化为0 1整数,以确保在第一次迭代中满足while()循环。

点2

strcmp(newPartie, "Y" == 0)

是不正确的用法。

无论使用

  • 具有&newPartien1 strncmp() ,或者( 不是很好的方法
  • 更好 )使用简单的等于运算符==就像if ((newPartie=='Y')|| (newPartie=='y'))

另外, strcmp() / strncmp()==相等比较应该看起来像strncmp(a,b,c) == 0

点3

更改

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

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

忽略存储在输入缓冲区中的先前换行符 ,并扫描非空白字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM