我有一个服务器 - 客户端程序,我可以添加或删除用户。当达到最大用户数(10)时,删除其中一个用户时出现错误。
以下是删除用户的功能部分:
int i;
int confirmacao = 0;
msg_t msg;
char cliname[10];
if (strlen(estrutura.id) == 3) {
for (i = 0; memoria->x[i].id[0] != '\0'; ++i) {
if (strcmp(estrutura.id, memoria->x[i].id) == 0) {
confirmacao = 1;
for (; memoria->x[i].id[0] != '\0'; ++i) {
memoria->x[i] = memoria->x[i + 1];
}
// I think the problem is with this memset
memset(memoria->x[i].id, '\0', sizeof(memoria->x[i].id));
printf("IA antes de decrementar: %i\n", memoria->ia);
memoria->ia--;
printf("Ia depois: %i\n", memoria->ia);
break;
}
}
} else {
...
}
memoria-> ia被称为减1,我可以弄清楚为什么memset将其设置为零。
memoria是这种结构的全局指针:
typedef struct mmap_uti_s {
uti_t x[NUTI];
int ia;
} mmap_uti_t;
和uti_t就是这个结构:
typedef struct uti_s {
char id[NDIG + 1];
char nome[NDIM + 1];
char portas[NPOR + 1];
} uti_t;
答案 0 :(得分:1)
复制上一个元素后,您无法重置最后一个元素,因为在测试数组末尾之前增加i
。此外,正如您所正确指出的那样,您必须始终在到达阵列末尾之前停止复制。
您应该将嵌套for
循环中的测试更改为:
for (; i + 1 < 10 && memoria->x[i + 1].id[0] != '\0'; i++)
您还应该更改主循环中的测试,以便在数组末尾的扫描结束时停止扫描。
虽然不是绝对必要,但在复制阶段使用不同的索引会更好,以避免修改当前循环的索引。
清除整个结构,而不仅仅是id
成员,似乎也是可取的。
以下是修改后的代码:
int i, j;
int confirmacao = 0;
msg_t msg;
char cliname[10];
if (strlen(estrutura.id) == 3) {
for (i = 0; i < 10 && memoria->x[i].id[0] != '\0'; ++i) {
if (strcmp(estrutura.id, memoria->x[i].id) == 0) {
confirmacao = 1;
for (j = i; j + 1 < 10 && memoria->x[j].id[0] != '\0'; ++j) {
memoria->x[j] = memoria->x[j + 1];
}
// I think the problem is with this memset
memset(&memoria->x[j], 0, sizeof(memoria->x[j]));
printf("IA antes de decrementar: %i\n", memoria->ia);
memoria->ia--;
printf("Ia depois: %i\n", memoria->ia);
break;
}
}
} else {
...
}