2014-07-09 28 views
0

所以我有一個存儲有關IRC連接信息的結構。它工作正常,但當我嘗試修改它的值變空時;Char []丟失數據

這是我的結構:

struct connection_info{ 
    char user[MAXBUFF + 1]; 
    char host[MAXBUFF + 1]; 
    char port[MAXBUFF + 1]; 
    char nick[MAXBUFF + 1]; 
    char channel[MAXBUFF + 1]; 
}; 

struct connection_info info; //Global Struct 

然後,我有一個全球性的結構(connection_info)和限定在結構中的每個元素,並連接到IRC服務器我的主要方法。在我連接到IRC服務器之後,我收聽消息並解析它們。在我這樣做後,我對每條消息作出不同的迴應。這是我的問題發生的地方。

if(strstr(message.message, "!JOINCHANNEL") != NULL){ 
     char* str = strtok(message.message, " "); 
     char* channel = strtok(NULL, " "); 

     if(str == NULL || channel == NULL || (*channel) != '#'){ 
      strcpy(buff, "PRIVMSG "); 
      strcat(buff, info.channel); 
      strcat(buff, " :Please use format !JOINCHANNEL [#CHANNEL]\r\n"); 
      while(send_message(buff) == -1); 
     }else{ 
      strcpy(buff, "PART "); 
      strcat(buff, info.channel); 
      strcat(buff, "\r\n"); 
      while(send_message(buff) == -1); 

      memeset(info.channel, 0, sizeof(info.channel)); 
      strcpy(info.channel, channel); 

      memset(buff, 0, sizeof(buff)); 
      strcpy(buff, "JOIN "); 
      strcat(buff, info.channel); 
      strcat(buff, "\r\n"); 
      while(send_message(buff) == -1); 
     } 
    } 

兩個問題:

,除非我得到的頻道名稱古怪的人物,我有時會做(倒置問號)它實際上改變到正確的通道。爲什麼有時候會發生這種情況,如果我的message.message是三部分「!JOINCHANNEL #test random」,它就不會發生,但是當它有兩部分時,它有時會給我隨機字符:「!JOINCHANNEL #test」。我怎樣才能解決這個問題?

其次更重要的是,在handle_message函數返回後,info.channel的值似乎消失了。我認爲strcpy()會在返回後保留值,因爲它是一個char [4097],但它似乎並不如此。我做錯了什麼,或者有沒有我聽說過的錯誤?

回答

0

編輯:假設buff已經是malloc分配指針(因爲你是通過它變成一個功能,而據我所知目前還沒有任何功能的問題存在),我修改我的代碼。當我第一次回答這個問題時,我誤解了它。

我沒有看到任何動態內存分配和char[4097]不這樣做,所以我覺得這就是問題所在。如果不是這樣,我會刪除這個答案。

基本上在函數返回後,char[4097]中堆棧上分配的內存超出範圍。無論堆棧是什麼樣的,你都需要內存來堅持。你要包括代碼看起來像這樣外handle_message

struct connection_info{ 
    char* user; 
    char* host; 
    char* port; 
    char* nick; 
    char* channel; 
}; 

struct connection_info* info 

handle_message

info = malloc(sizeof(connection_info)); 
// Then, in the code snippet you posted 
if(strstr(message.message, "!JOINCHANNEL") != NULL){ 
    //You can initialize with calloc instead of memset with 0s 
    info->channel = calloc(strlen(channel)+1); 
    strcpy(info->channel, channel); 
} 
+1

其實這不是我的內存分配爲connection_info是全球堆棧所以這是從來沒有被推關閉。事實上,strtok()在我上次調用它時給了我意想不到的行爲。所以有時候我不會得到一個頻道,我會得到一個像「#channelname \ 123p?!sad123」這樣的字符串。不過謝謝你的幫忙! – schmidt73

+0

所以info.channel消失的問題仍然存在? –