2011-05-27 15 views
0

我對C很陌生(我更習慣於C++),我正在嘗試創建一個IRC Bot。目前我正在努力尋找正確的字符串解析函數解析這一行:解析C中的IRC PRIVMSG

:[email protected] PRIVMSG #channel :message (could contain the word PRIVMSG) 

於是,我問如果有人能告訴我什麼功能我會用這條線分割成:

  • 缺口
  • 用戶名
  • 服務器
  • 通道
  • 消息

感謝您的幫助!

+0

郵件正文是否包含單詞「PRIVMSG」並不重要:冒號後面的所有內容都被認爲是郵件正文,最多512字節後面以「\ r \ n」結尾。 – Philip 2011-05-27 22:32:30

回答

2

我可能會使用sscanf。這個一般順序的東西似乎是一個合理的起點:

char nick[32], user[32], server[32], channel[32], body[256]; 

sscanf(buffer, ":%31[^!]!~%31[^@]@%31s PRIVMSG #%31s :%255[^\n]", 
       nick,  user, server,  channel, body); 
+0

第一個arg到sscanf是要解析的緩衝區,第二個arg是模板字符串... – Juliano 2011-05-27 17:47:10

+0

@Juliano:哎呀 - 謝謝。固定。 – 2011-05-27 17:48:46

+0

暱稱,用戶,主機名,頻道和內容的長度可以根據服務器而改變,這可能不是最好的方法。 – Wiz 2011-06-02 11:37:09

1

考慮到這一切是,你可以寫上(即內容會被覆蓋),你可以做一個char []緩衝區像:

char *nick, *username, *server, *command, *channel, *message; 

nick  = strtok(buffer+1, "!"); 
username = strtok(NULL, "@"); 
server = strtok(NULL, " "); 
command = strtok(NULL, " "); 
channel = strtok(NULL, " "); 
message = strtok(NULL, ""); 

您需要添加一些錯誤檢查,以上面的代碼,因爲任何調用strtok如果沒有更多的令牌被發現()可能返回NULL。你也可以使用一些更詳細的解析,或sscanf()。

閱讀關於strtok(3)sscanf(3)的頁面。

+0

應該注意的是'strtok()'在使用後破壞了輸入字符串。應該考慮一些事情。 – Wiz 2011-06-02 11:34:05

+0

@Wiz,閱讀答案的第一段。 – Juliano 2011-06-02 13:58:04