Проблема с указателями C "неверный параметр"? - PullRequest
1 голос
/ 23 апреля 2020

Я должен сделать игру, в которую можно играть с 2 или 3 игроками, для этого мне нужна структура, которую я назвал Player. Я хотел спросить пользователя о количестве «игроков» и сделать для l oop, чтобы сгенерировать игроков на основе введенного ими числа, например:

int playerNumbers = 0;
while (playerNumbers != 2 || playerNumbers != 3)
{
        printf("How many players are you ? 2 or 3 ? : \n");
        scanf_s("%d", playerNumbers); 

/* Error here: Unhandled exception to 0x7A72F2F6 (ucrtbased.dll) in Wheel.exe: 
An invalid parameter was passed to a function that considers invalid parameters
to be an unrecoverable cause of error. */

}
  // La boucle se répète 2 ou 3 fois
for (int i = 0; i < playerNumbers; i++)
{
        Player* player;
        if (i == 0)
        {
                player = &j1;
        }
        else if (i == 1)
        {
                player = &j2;
        }
        player = &j3;

        char tempo[50];
        printf("Enter your name : ");
        fgets(tempo, BUFFER_SIZE, stdin);
        i = 0;
        while (tempo[i] != '\n') {
                i++;
        }
        player->name = malloc(i * sizeof(char));
        strncpy_s(player->name, i, tempo, i);
        player->bank = 0;
        player->score = 0;
        player->ExtraTurn = 0;
        player->win = 0;
}

Проблема: ошибка в моем scanf_s строка (см. комментарий), и, наконец, у меня есть окно, которое открывается и в основном говорит мне, что в файле "input.h" в строке 1567 Выражение: result_pointer! = nullptr

Мне никогда не приходилось иметь дело с этими ошибки, и интересно, была ли необходимость в двойном указателе?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Как указывал UnholySheep, при попытке scanf целого числа необходимо использовать оператор & (address-of).


Ваш l oop для проверки ввода неверен:
while (playerNumbers != 2 || playerNumbers != 3)

Одно из этих двух условий ВСЕГДА верно, поэтому l oop никогда не завершается.
Это должно быть:

while (playerNumbers != 2 && playerNumbers != 3)


Кроме того, вы действительно сделали этот l oop длиннее и сложнее, чем необходимо. Вот более короткая и лучшая версия.
Player player[playerNumbers];
for (int i = 0; i < playerNumbers; i++)
{
    char tempo[50];
    printf("Enter your name : ");
    fgets(tempo, BUFFER_SIZE, stdin);
    player[i] = (Player){ .bank = 0, .score = 0, .ExtraTurn = 0, .win = 0, .name = _strdup(tempo) };
}
0 голосов
/ 23 апреля 2020

Как указано в комментариях, аргумент функции scanf_s, соответствующий полю формата %d, должен быть адресом целочисленной переменной (в вашем случае, playerNumbers), вместо самой переменной, поэтому вы должны добавить & перед именем переменной в списке аргументов.

Кроме того, ваше условие проверки для 'input' l oop, while (playerNumbers != 2 || playerNumbers != 3) неверно, поскольку условие всегда оценивается как 'истинное': playerNumbers не может быть одновременно 2 и 3 одновременно, поэтому хотя бы один из тестов != будет верным! Чтобы исправить это, измените оператор || (или) на && (и), чтобы l oop завершился, если либо test равен 'false':

while (playerNumbers != 2 && playerNumbers != 3) // Keep asking if it's not 2 AND not 3
{
    printf("How many players are you ? 2 or 3 ? : \n");
    scanf_s("%d", &playerNumbers); // Not the added "&" - to get the ADDRESS of playerNumbers
}

Далее, опять же, как указано в комментариях, вы почти наверняка захотите заключить строку player = &j3; в блок else:

    if (i == 0) {
        player = &j1;
    }
    else if (i == 1) {
        player = &j2;
    }
    else {
        player = &j3;
    }

, в противном случае предыдущие назначения player всегда будут быть отменённым!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...