2014-07-09 3 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

EDIT: Предполагая buff уже является malloc'd указатель (поскольку вы передаете в функцию, и, насколько я знаю, нет никаких проблем функциональности там), я изменил свой код. Я неправильно понял это, когда я впервые ответил на этот вопрос.

Я не вижу динамического распределения памяти, а 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 все еще существует? –

Смежные вопросы