2017-04-15 82 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變量溢出,應該出現分段錯誤。 –