C指针 "无效参数 "的问题?

问题描述 投票:0回答:1

我必须做一个游戏,可以和2到3个玩家一起玩,为此我需要一个结构,我把它命名为Player.我想向用户询问 "玩家 "的数量,然后做一个for循环,根据他们输入的数量来生成玩家,就像这样。

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行Expression : result_pointer != nullptr。

我从来没有处理过这些错误,我想知道是否有必要使用双指针?

c pointers
1个回答
1
投票

正如UnholySheep所指出的,当试图 scanf 的整数,你需要使用 & (地址的)运算符。


你测试输入的循环是错误的。
while (playerNumbers != 2 || playerNumbers != 3)

这两个条件中的一个永远是真的,所以循环永远不会结束。应该是这样的。

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


另外,你把那个循环弄得比必要的还要长,还要复杂。 下面是一个更短,更好的版本。
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
投票

正如评论中所指出的,对 scanf_s 函数,对应于 %d 格式字段应该是 地址 的整数变量(在你的例子中。playerNumbers),而不是变量本身,所以你应该在变量中添加一个叫做 & 在参数列表中的变量名称之前。

还有,你的 "输入 "循环的测试条件。while (playerNumbers != 2 || playerNumbers != 3) 是错误的,因为该条件将 始终 评价为'true'。playerNumbers 不能同时是 23 同时,因此,至少有一 != 测试将为真! 要解决这个问题,请修改 || 运营商,以 && (and),这样循环就会退出,如果 要么 测试为'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
}

此外,正如评论中所指出的,你几乎可以肯定的是,你想把 "false "这个词包括在内 player = &j3; 一行 else 块。

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

否则,以前的分配给 player 将永远被推翻!

© www.soinside.com 2019 - 2024. All rights reserved.