我在C语言中遇到了一个奇怪的问题,我正在处理一个结构。structs元素之一是大小为3的char数组数组。元素应该是玩家的手,而char数组应该是单独的牌。它们的格式类似于“2C”,其中2是等级,C是俱乐部。我的问题在于一个从给定字符串创建播放器指针的函数。在循环中,j是卡片索引,最后它将创建的卡片(我知道是正确的)分配给索引。在循环的最后一次迭代中,它分配4C,并且由于某种原因,每个元素都变成4C。下面是函数的代码:
typedef struct dataStruct {
int playerCount;
int handSize;
char playerID;
char** playerHand;
} dataStruct;
void proc_new_round(struct dataStruct* data, char* input) {
int length = strlen(input), i = 9, j = 0;
char tempChar[3];
if (length != 86 && length != 59 && length != 47)
invalid_hub_message();
else if (input[8] != ' ')
invalid_hub_message();
alloc_hand_size(data, (length - 8) / 3);
for (j = 0; j < data->handSize; j++) {
if (input[i] != '2' && input[i] != '3' && input[i] != '4' &&
input[i] != '5' && input[i] != '6' && input[i] != '7' &&
input[i] != '8' && input[i] != '9' && input[i] != 'T' &&
input[i] != 'J' && input[i] != 'Q' && input[i] != 'K' &&
input[i] != 'A' ) {
invalid_hub_message();
}
tempChar[0] = input[i++];
if (input[i] != 'H' && input[i] != 'D' && input[i] != 'C' &&
input[i] != 'S' ) {
invalid_hub_message();
}
tempChar[1] = input[i++];
tempChar[2] = '\0';
printf("tempchar %s\n", tempChar);
data->playerHand[j] = tempChar;
if (i < length) {
if (input[i++] != ',')
invalid_hub_message();
}
printf("%d\n", j);
}
data->playerHand[5] = "7C";
printf("%s\n", data->playerHand[5]);
printf("%s\n", data->playerHand[12]);
printf("%s\n", data->playerHand[7]);
//print_hand(data);
}
函数的输入为:
新一轮2C,2C,2C,2C,2C,2C,2C,2C,2C,2C,4C
在功能结束时,打印的3张卡分别是7C、4C和4C,但考虑到创建的临时卡,应该是7C、4C和2C。我的打印手功能也将除索引5以外的所有卡打印为4C。有人能告诉我这里发生了什么吗?
最佳答案
data->playerHand[j] = tempChar;
data->playerHand
中的所有指针都具有相同的值,并指向同一数组tempChar
。最后写入tempChar
的内容将显示为所有内容的最终值。你的代码类似于:
int *a[4];
int tmp;
int j;
for (j = 0; j < 4; j++) {
tmp = j * 10;
a[j] = &tmp;
}
int dummy = 42;
a[1] = &dummy;
printf("%d %d %d %d\n", *a[0], *a[1], *a[2], *a[3]);
所有数组元素都被循环设置为指向
tmp
。然后覆盖a[1]
以指向dummy
。tmp
和dummy
的最终值分别为20
和42
,因此输出为20 42 20 20
关于c - 将指针索引到Struct中的char指针会覆盖所有值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32815696/