所以我有一个结构存储有关IRC连接的信息。它工作正常,但当我尝试修改它时,它变为空;
这是我的结构:
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)和我的main方法,它定义结构中的每个元素并连接到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 :(得分: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);
}