Char在C中用缓冲环链接列表

时间:2017-01-11 15:19:45

标签: c data-structures linked-list cygwin

我有一台服务器和一台客户端。客户端可以通过输入ADD来向ADD发送请求,例如ADD:Joe:2它应该添加到列表中。 Key = Joe Value = 2。

我正在尝试将一个键:值添加到使用最多5个元素的缓冲区的链表中。当链表达到元素(5)的最大大小并输入新键:值时,最旧的元素将被新元素覆盖。

每次添加它似乎都添加正常,但是当达到最大尺寸并尝试删除第一个KEY:VALUE时它会崩溃。

添加到列表:

 void push_item(struct item** Front,struct item** Rear,char *new_key,char *new_value,int newsockfd)
    {
        char buffer [50] = {0};

            struct item* new_node = malloc(sizeof(struct item));
            strcpy(new_node->value,new_value);
            strcpy(new_node->key,new_key);
            //new_node->next = NULL;
            if(p_size==5)
            {


                char *itemVal;
                char *itemKey;
                /* if queue is empty */
                if ( *Front == NULL )
                {
                    printf ( "List is empty");
                }
                else
                {
                    if (*Front == *Rear)
                    {
                        strcpy(itemVal,(*Front)->value);
                        strcpy(itemKey,(*Front)->key);
                        free(*Front);
                        *Front = NULL ;
                        *Rear = NULL ;
                    }
                    else
                    {
                        //delete node
                        new_node = *Front;
                        strcpy(itemVal,new_node->value);
                        strcpy(itemKey,new_node->key);
                        *Front=(*Front)->next;
                        (*Rear)->next=*Front;
                        free(new_node);
                    }
                    printf("Node deleted Key: %s Value: %s",itemKey,itemVal);
                }
            }
            else
            {
                *Rear=new_node;
                (*Rear)->next=new_node;

                if(*Front==NULL)
                {
                    (*Front)=new_node;
                    p_size++;
                }
                else
                {
                    (*Rear)->next=new_node;
                    p_size++;
                    printf("Elements in List: %d\n",p_size);
                }

            }

            sprintf(buffer,"Added");
            int num_bytes = write(newsockfd, buffer, strlen(buffer));
            if (num_bytes < 0) 
            {
                fprintf(stderr, "Thread ERROR: write() failed\n");
            }
}

服务器:

struct item *Front = NULL;
struct item *Rear = NULL;
char buffer[BUFFER_SIZE] = {0};

void* handle_client(void *socket)
{
    int newsockfd = (int)socket;
    pthread_t thread_id = pthread_self();

    printf("----------\nThread %lu using socket %x\n", (unsigned long)thread_id, newsockfd);

    /* Start communicating */
    int num_bytes = read(newsockfd, buffer, BUFFER_SIZE-1);
    if (num_bytes < 0) {
        fprintf(stderr, "Thread %lu ERROR: read() failed\n", (unsigned long)thread_id);
        return NULL;
    }
    printf("Thread %lu recieved request\n", (unsigned long)thread_id);

    if(strncmp(buffer,"ADD",3)==0)
    {
        char* key = buffer+4;
        int charIndex;
        char *new_value = strchr(buffer+4 , ':')+1;
        charIndex = (int)(new_value-buffer)-1;
        buffer[charIndex] = '\0';

        push_item(&Front,&Rear,key,new_value,newsockfd);

        printf("Value:%s Key:%s\n",new_value,key);
    }

修改 CMD图片: Left cmd is the client and the right one is the server

p_size表示链表中的当前元素数。 它在进入if条件P_size == 5后崩溃。

1 个答案:

答案 0 :(得分:0)

push_item()函数中查找if(p_size==5)时遇到的问题时,错误是在写入要删除的节点的数据时。

错误1 - 临时itemValitemKey被声明为char *但从未分配给数组。

// To do
strcpy(itemVal,(*Front)->value);
strcpy(itemKey,(*Front)->key);
// or
strcpy(itemVal,new_node->value);
strcpy(itemKey,new_node->key);
  

应分配char *itemVal;char *itemKey;

// Local variables (STR_SIZE has to be adjusted)
char itemVal[STR_SIZE+1];
char itemKey[STR_SIZE+1];

警告1 - 但解决该问题会导致使用链接列表时环形缓冲区算法出现故障。

  

push_item()函数中,写入/推送指针*Front和   读/弹出指针*Rear是独立管理的。当。。。的时候   环形缓冲区已满(if(p_size==5)),而是删除新项目   最古老的一个。