2017-04-15 73 views
0

我在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'时间,但从不在最后一行。

这可能是什么原因造成的?

+0

添加一些'printf()'在循环内部调用和'if'语句。 –

+0

我确实在if语句中有打印。它正在完成所有迭代。 – zomboy

+0

你应该在这里显示你的代码。 –

回答

0

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

  1. 1或2个字节为"\n"(视系统而定)
  2. 最多2个字节为"%d"(假设你数到99)
  3. 2个字节". "
  4. 了为"%s"

你的暂时缓冲器20个字节char tmp[25];太窄 - 必须是至少26个字节大(计数NULL终止子)。

如果你有一个100个用户的列表,需要总共至少2601字节的缓冲区,但从它的外观来看,你只是提供了2300的缓冲区的功能。附注:只需指定函数的输入参数为char buf[2300]实际上什么也没做分配那个缓冲区。当你调用你的函数时,你必须确保你提供了必要的缓冲区。

您没有得到第二个printf()的原因是因为您的程序在达到该点之前终止。终止的原因是内存访问冲突 - 当您尝试将内容写入不属于缓冲区的内存时(小问题或缺陷问题),会发生这种情况

+0

问题应该在tmp变量而不是buf。 buf变量实际上是在发送一个指针,所以它会保持在它上面的strcat()。如果tmp变量溢出,应该出现分段错误。 –