【问题标题】:Parse IRC PRIVMSG in C在 C 中解析 IRC PRIVMSG
【发布时间】:2011-09-03 13:57:39
【问题描述】:

我对 C 很陌生(我更习惯于 C++),我正在尝试创建一个 IRC Bot。我目前正在努力寻找正确的字符串解析函数来解析这一行:

:nick!~username@server PRIVMSG #channel :message (could contain the word PRIVMSG)

所以,我在问是否有人可以告诉我我将使用哪些函数来将此行拆分为:

  • 尼克
  • 用户名
  • 服务器
  • 频道
  • 留言

感谢您的帮助!

【问题讨论】:

  • 邮件正文是否包含“PRIVMSG”这个词无关紧要:冒号后面的所有内容都被认为是邮件正文,最多512个字节后以“\r\n”结尾"。

标签: c parsing irc


【解决方案1】:

我可能会使用 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);

【讨论】:

  • sscanf的第一个arg是要解析的缓冲区,第二个arg是模板字符串...
  • 昵称、用户、主机名、频道和内容的长度可以根据服务器而变化,这可能不是最好的方法。
  • 对,规范中提到的唯一长度是总消息大小:510 字节加上一个 CRLF。依赖这些长度必然会导致问题。
  • @Pygmalion:是的,这就是“按照这个一般顺序的东西似乎是一个合理的起点”和“这里是完成的代码”之间的区别。但是,是的,规范(RFC 1459,因为您显然没有意识到它)确实指定了最大长度。
  • 有吗?在哪里?我已经阅读了规范(我现在正在使用 IRC 服务器)并且没有看到任何提及它。如果您不知道,RFC 2812 在 2000 年更新了 RFC 1459。编辑:实际上我看到昵称有 9 个字符的限制,而主机有 63 个字符的限制(更广泛的 Internet 上主机名的最大长度)。跨度>
【解决方案2】:

考虑到所有这些都在您可以写入的 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) 的页面。

【讨论】:

  • 需要注意的是strtok()在使用后会破坏输入字符串。应该考虑到一些事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多