从结构数组中删除项目

我是守护者

所以我在 C 中实现了一个 TCP 服务器聊天室,并使用 poll 来处理多个客户端。用户使用用户名和密码注册,然后使用它登录。当他们登录时,我想将它们添加到这个结构数组中。

struct onlineUsers{
int sockfd;
char username[9]; //usernames size is maximum 8 characters
};

struct onlineUsers users[10];

//The login function is pretty long so is here the relevant part.
    if(!searchExist(search, db)){
        printf("Account doesnt exist.\n");
        fclose(db);
        free(search);
        return -1;
    }
    else{
        printf("Logged in\n");
        // Add to onlineUser struct arr[]
    }

但是当客户端关闭连接时,您将如何从 onlineUsers 数组中删除该特定元素?我还没有实现添加它们的方法,因为我真的没有很好的方法来删除它们。

艾伦温德

我把它改造成一个最小的例子,并为你实现了一个线性搜索(如果可用,使用lfindinremove_user()lsearchin add_user()):

#include <assert.h>
#include <string.h>

#define MAX_NAME 8
#define MAX_USERS 2

struct user {
    char name[MAX_NAME + 1];
};

unsigned find_pos(struct user *users, const char *name) {
    unsigned empty = MAX_USERS;
    for(unsigned i = 0; i < MAX_USERS; i++) {
       if(empty == MAX_USERS && !users[i].name[0]) empty = i;
       if(!strcmp(users[i].name, name)) return i;
    }
    return empty;
}

int add_user(struct user *users, const char *name) {
    unsigned pos = find_pos(users, name);
    if(pos == MAX_USERS) return -1;
    if(users[pos].name[0]) return 1;
    // safe as name[8] is 0 initialized; otherwise
    // copy MAX_NAME + 1 then set name[MAX_NAME] = '\0'
    // to ensure string is \0 terminated.
    strncpy(users[pos].name, name, MAX_NAME);
    return 0;
}

int remove_user(struct user *users, const char *name) {
    int pos = find_pos(users, name);
    if(!users[pos].name[0] || strcmp(users[pos].name, name)) return 1;
    users[pos].name[0] = '\0';
    return 0;
}


int main() {
    struct user users[MAX_USERS] = { 0 };
    assert(add_user(users, "bob") == 0); // ok (1 of 2)
    assert(add_user(users, "bob") == 1); // duplicate
    assert(remove_user(users, "bob") == 0); // ok (empty)
    assert(remove_user(users, "jane") == 1); // non-existing
    assert(add_user(users, "bob") == 0); // ok (1 of 2)
    assert(add_user(users, "jane") == 0); // ok (2 of 2)
    assert(add_user(users, "jack") == -1); // full
    assert(remove_user(users, "bob") == 0); // ok
    assert(find_pos(users, "jane") == 1); // ok (not empty slot)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章