gpt4 book ai didi

c - 为什么在请求用户再次输入后字符数组为空?

转载 作者:行者123 更新时间:2023-11-30 20:58:18 25 4
gpt4 key购买 nike

我正在用 C 语言开发 TicTacToe,但在显示玩家姓名时遇到问题。
每次玩家必须采取行动时,我都会显示“轮到你了,%s!”。
但从第二次迭代开始,玩家名称为空。

经过一些测试,我发现当我注释第 56 行时,问题不会发生。

控制台输出:

Starting...

Type your username (20 characters): Paulo

Type your username (20 characters): Edson


A B C
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, Paulo!

Choose a position (Ex.: B2, A0, etc): A2

Picked: A2


A B C
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, !

Choose a position (Ex.: B2, A0, etc): A3

Picked: A3


A B C
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, !

Choose a position (Ex.: B2, A0, etc): ^C

这是我的代码:

#include <stdio.h>
#include <string.h>

void pickposition(char * position) {
printf("\nChoose a position (Ex.: B2, A0, etc): ");
scanf(" %2s", position);
}

void printtable(char table[3][3]) {
printf("\n\n");

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
char c = table[i][j];
if (c != 'O' && c != 'X') {
table[i][j] = '_';
}
}
}

printf(" A B C \n");
printf("0 _%c_|_%c_|_%c_\n", table[0][0], table[0][1], table[0][2]);
printf("1 _%c_|_%c_|_%c_\n", table[1][0], table[1][1], table[1][2]);
printf("2 _%c_|_%c_|_%c_\n", table[2][0], table[2][1], table[2][2]);
printf("\n\n");
}

void pickusername(char *name) {
printf("\nType your username (20 characters): ");
scanf("%20s", name);
}

int main() {
printf("\nStarting...\n");
char table[3][3];

char player1[20];
char player2[20];

pickusername(player1);
pickusername(player2);

int next = 1;
int counter = 0;
while (1) {
char nextname[20];
printtable(table);
if (next) {
strcpy(nextname, player1);
} else {
strcpy(nextname, player2);
}
printf("It's your turn, %s!\n", nextname);

char positionpicked[2];
pickposition(positionpicked);
printf("\nPicked: %s\n", positionpicked);

counter--;
if (counter == -20) {
break;
}
}
}

PS.:我知道next始终为1,这只是一个草稿。

最佳答案

当我运行你的程序时,它对我来说运行良好。但 positionpicked 数组的大小需要进行一些小修正。您要求用户输入两个字符(A0/B1),但 positionpicked 只有 2 个元素,这意味着没有分配内存来存储 '\0'。因此 positionpicked 的大小应增加到 3。

这也可能是问题的原因(我不确定,但很可能是),因为这个 NULL 字符有可能覆盖player1[0]。

在第一次迭代期间:-

player1 -> Pablo0
player2 -> Edson0
positionpicked -> A20 /* Since positionpicked can only store 2 bytes the 0('\0')
is stored in the adjacent memory location */

在第二次迭代期间:-

player1 -> 0ablo0    /* Which will print a null string */

关于c - 为什么在请求用户再次输入后字符数组为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53117480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com