生成一个秘密数字并在C中进行猜测

时间:2018-10-23 05:10:43

标签: c pointers

所以,有一点背景知识,我必须创建一个程序,在其中生成一个秘密数字,用户必须输入一个三位数的数字作为猜测,并且该程序应始终打印提示。如果在正确的位置有一个数字,则提示将打印“ fermi”;如果在正确的位置具有一个数字,则提示“ pico”;如果没有正确的位置,则显示“百吉饼”。我遇到的问题是我不断收到错误消息或警告消息“不使用强制转换就从指针生成整数”,我认为我没有正确将指针传递给函数,因此如果有人可以帮助我,将不胜感激

int main()
{
    setvbuf(stdout, NULL, _IONBF, 0);
    srand((int)time(NULL));
    play_game();
}

void play_game()
{
    int *num1 = 0;
    int *num2 = 0;
    int *num3 = 0;
    int guess,first,second,third, x;
    theSame(&num1, &num2, &num3);
    do
    {
        printf("\nPlease enter a three digit number as your guess or enter 0 to exit: ");
        x = scanf("%d", &guess);
        if(!x == 0)
        {
            first = guess/ 100;
            second = (guess%100) /10;
            third = guess %10;
            printf("Guess: %d, ", guess); print_hint(guess, num1,num2,num3);
            is_guess_correct(guess, num1, num2, num3);
        }

    }
    while((!x == 0));
}

void generate_secret_number(int *a, int *b, int *c)
{
    *a = (rand() % 9) + 1;
    *b = (rand() % 10);
    *c = (rand() % 10);
} 

int is_guess_correct(int guess, int a, int b, int c)
{
    int first, second, third;
    first = guess/ 100;
    second = (guess%100) /10;
    third = guess %10;

    if (first == a && second == b && third == c)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void print_hint(int guess, int a, int b, int c)
{
    int first, second, third;
    first = guess/ 100;
    second = (guess%100) /10;
    third = guess %10;

    if (a == first || b == second || c == third)
    {
        printf("Fermi, ");
    }
if (first == b || first == c || second == a || second == c || third == a || third == b)
    {
        printf("Pico, ");
    }
    if (a == first && b == second && c == third)
    {
        printf("Winner !!");
    }
    else if(a != first && b != second && c!= third)
    {
        printf("Bagels");
    }
}

void theSame(int *a, int *b, int *c)
{
    generate_secret_number(a,b,c);
    while(*a == *b || *b == *c || *c == *a)
    {
        if (*a == *b)
        {
            *a = (rand() % 8) + 1;
        }
        if (*b == *c)
        {
            *b = (rand() % 9);
        }
        if (*a == *c)
        {
            *c = (rand() % 9);
        }
    }
    printf("\nsecret number: %d%d%d", *a,*b,*c);
}

2 个答案:

答案 0 :(得分:2)

int *num1 = 0;
int *num2 = 0;
int *num3 = 0;

我认为这不是您想要的。您声明3个指向0的指针,没有分配内存,然后将指针的地址传递给void theSame(int *a, int *b, int *c)
也许您想从声明中删除*,然后声明普通变量,然后在将其地址传递给函数时使用正确的接口。

如果将numX声明为整数而不是指针,则所有其他接口也将正确使用。因此,请改用此:

int num1 = 0;
int num2 = 0;
int num3 = 0;

您还应该在使用函数之前声明它们,因此,您应该使用前向声明(推荐)或在文件开头复制这些函数。


作为旁注,如果您使用-Wall激活警告,则会发现int first, second, third中未使用play_game()

答案 1 :(得分:1)

指针处理存在两个主要问题: the_same的函数调用需要指向int的指针,但是您正在传递指针的地址。

第二个问题是调用is_guess_correct和调用print_hint。它需要三个Integer,但是您要传递指针而不是它们的值。

解决方案是用整数替换指针的声明。然后,您要将变量的地址传递给the_same,并将值传递给其他函数。