Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中解析IRC PRIVMSG_C_Parsing_Irc - Fatal编程技术网

在C中解析IRC PRIVMSG

在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

我对C非常陌生(我更习惯C++),我正在尝试创建一个IRC机器人。我目前正在努力找到正确的字符串解析函数来解析此行:

: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()
在使用输入字符串后会破坏它。应该考虑一下。