我正在用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/