首页 > 解决方案 > 生成一个秘密数字并在 C 中猜测它

问题描述

所以有一点背景,我必须创建一个程序,在其中你生成一个秘密数字,用户必须输入一个三位数的数字作为猜测,并且程序应该一路打印提示。如果数字在正确的位置,则打印“fermi”,如果数字正确但不在正确的位置,则打印“pico”,如果没有匹配,则打印“bagels”。我遇到的问题是我不断收到错误或警告消息“从没有强制转换的指针中生成整数”我假设我没有将指针正确传递到我的函数中,所以如果有人能帮助我,将不胜感激.

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

标签: cpointers

解决方案


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()


推荐阅读