我正在用C做一个学校项目,而我一直迷于这个难题。
因此,我们需要使用100个用户的套接字来实现消息传递系统。
我将用户的数据存储在此结构中。

typedef struct user
{
   char username[20];
   int online;        //flag value 1 = online, 0 = offline
   msg *message_list;
   int message_count;
}


我们需要实现的一项服务是提取所有当前已连接用户的列表。我已经为该任务编写了此功能。

void all_connected(char buf[2300])
{
    printf("\n entering all_connected for %d iterations",user_count);
    int i, count = 1;
    char tmp[25];
    for (i=0; i<user_count; i++)
    {
        if(users[i] -> online == 1)
        {
            sprintf(tmp, "\n\t%d. %s", count++, users[i] -> username);
            strcat(buf, tmp);
        }
    }
    printf("\n exiting all_connected");
}


现在出于某种奇怪的原因,当我在请求服务时调用此函数时,它会打印第一个printf(为x迭代输入all_connected)。但它不会打印出我在最后一行输入的内容。
这是否意味着该函数卡在某行上?我检查了一下,它正在迭代“ user_count”次,但从未出现在最后一行。

发生这种情况的原因可能是什么?

最佳答案

此格式字符串"\n\t%d. %s"(假设每个用户最多20个字符)将需要26字节(ASCII)的缓冲区。原因如下:


"\n" 1或2个字节(取决于系统)
"%d"最多2个字节(假设您最多计数99个)
2个字节用于". "
"%s"最多20个字节


您的临时缓冲区char tmp[25];太窄-必须至少为26个字节大(计算NULL终止符)。

如果您有100个用户的列表,这些列表需要至少2601字节的总缓冲区,但是从外观上看,您只为函数提供了大小为2300的缓冲区。旁注,仅将函数的输入参数指定为char buf[2300]对于实际分配该缓冲区没有任何作用。您必须确保在调用函数时提供必要的缓冲区。

您没有获得第二个printf()的原因是,您的程序在到达该点之前就终止了。终止的原因是内存访问冲突-当您尝试将不属于缓冲区的内容写到内存中时(发生这种情况的情况很小,也可能是错误)。

关于c - 功能陷入循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43429597/

10-15 00:24