在C中解析IRC PRIVMSG
我对C非常陌生(我更习惯C++),我正在尝试创建一个IRC机器人。我目前正在努力找到正确的字符串解析函数来解析此行:在C中解析IRC PRIVMSG,c,parsing,irc,C,Parsing,Irc,我对C非常陌生(我更习惯C++),我正在尝试创建一个IRC机器人。我目前正在努力找到正确的字符串解析函数来解析此行: :nick!~username@server PRIVMSG #channel :message (could contain the word PRIVMSG) 因此,我想问是否有人可以告诉我,我将使用什么函数将这条线拆分为: 尼克 用户名 服务器 渠道 信息 谢谢你的帮助 我可能会使用sscanf。这个总的顺序似乎是一个合理的起点: char nick[32], use
:nick!~username@server PRIVMSG #channel :message (could contain the word PRIVMSG)
因此,我想问是否有人可以告诉我,我将使用什么函数将这条线拆分为:
- 尼克
- 用户名
- 服务器
- 渠道
- 信息
谢谢你的帮助 我可能会使用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。这个总的顺序似乎是一个合理的起点:
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);
考虑到所有这些都在可以写入的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()
阅读关于和的页面。考虑到所有这些都在可以写入的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()
阅读关于和的页面。sscanf的第一个参数是要分析的缓冲区,第二个参数是模板字符串…昵称、用户、主机名、频道和内容的长度可以根据服务器的不同而变化,这可能不是最好的方法。对,规范中提到的唯一长度是消息的总大小:510字节加上一个CRLF。依赖这些长度必然会引起问题。@Pygmalion:是的,这就是“一般顺序上的某些东西似乎是一个合理的起点”和“这是完成的代码”之间的区别。但是,是的,规范(RFC1459,因为你显然不知道)确实规定了最大长度,是吗?哪里我已经阅读了这个规范(我现在正在一个IRC服务器上工作),没有看到任何关于它的提及。如果您不知道,RFC2812在2000年更新了RFC1459。编辑:实际上我看到Nick有9个字符的限制,主机有63个字符的限制(在更广泛的互联网上主机名的最大长度)。第一个参数到sscanf是要解析的缓冲区,第二个参数是模板字符串…昵称、用户、主机名、频道和内容的长度可以根据服务器的不同而变化,这可能不是最好的方法。对,规范中提到的唯一长度是消息的总大小:510字节加一个CRLF。依赖这些长度必然会引起问题。@Pygmalion:是的,这就是“一般顺序上的某些东西似乎是一个合理的起点”和“这是完成的代码”之间的区别。但是,是的,规范(RFC1459,因为你显然不知道)确实规定了最大长度,是吗?哪里我已经阅读了这个规范(我现在正在一个IRC服务器上工作),没有看到任何关于它的提及。如果您不知道,RFC2812在2000年更新了RFC1459。编辑:实际上我看到Nick有9个字符的限制,主机有63个字符的限制(在更广泛的Internet上,主机名的最大长度)。消息正文是否包含单词“PRIVMSG”并不重要:冒号后面的所有内容都被视为消息正文,最多512个字节后以“\r\n”结尾。消息正文是否包含单词“PRIVMSG”无关紧要:冒号后的所有内容都被视为消息正文,最多512字节后以“\r\n”结尾。应该注意的是,
strtok()
在使用输入字符串后会销毁该字符串。应该考虑一些事情。应该注意的是,strtok()
在使用输入字符串后会破坏它。应该考虑一下。