我必须做一个游戏,可以和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。
我从来没有处理过这些错误,我想知道是否有必要使用双指针?
正如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) };
}
正如评论中所指出的,对 scanf_s
函数,对应于 %d
格式字段应该是 地址 的整数变量(在你的例子中。playerNumbers
),而不是变量本身,所以你应该在变量中添加一个叫做 &
在参数列表中的变量名称之前。
还有,你的 "输入 "循环的测试条件。while (playerNumbers != 2 || playerNumbers != 3)
是错误的,因为该条件将 始终 评价为'true'。playerNumbers
不能同时是 2
和 3
同时,因此,至少有一 !=
测试将为真! 要解决这个问题,请修改 ||
运营商,以 &&
(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
将永远被推翻!