我正在用 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 (输入 all_connected 进行 x 次迭代);但它不会打印我放在最后一行的内容。
这是否意味着该函数卡在了某行?我检查了一下,它正在迭代“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/