早些时候有人发布了一个关于他们正在为 IRC 开发的机器人的问题。
他们提到,在向服务器发送列出频道的命令时,服务器将回复所有频道的原始数据,并且在该列表的末尾将是ENDOFLIST
. 他们还表示,他们不知道正在发送的数据的实际长度,也不能完全依赖于这样的函数,strstr
因为如果用户命名了一个通道ENDOFLIST
,则字符串将在那里终止。然后他们询问是否有可能确定真实数据何时ENDOFLIST
出现在他们拥有的原始数据缓冲区中。
我的想法只是遍历数据,直到ENDOFLIST
找到最后一个实例,然后离开最后一个实例的位置。在我发布答案之前,提出问题的人将其删除,但我仍然想知道我的解决方案是否可行。
这就是我想出的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*function I wrote for myself a while back to find substrings*/
int strsbstr(const char *str, const char *sbstr)
{
char *sbstrlc;
if(!(strcmp(str, sbstr))) return 0;
if(!(sbstrlc = strstr(str, sbstr))) return -1;
return (int) (sbstrlc - str);
}
int main(int argc, char *argv[])
{
int index = 0, location = 0;
char *string;
if(!(string = malloc(37))) return 0x00;
strcpy(string, "FOOBARENDOFLISTENDOFLISTENDOFLISTFOO"); //string contains "ENDOFLIST" three times
index = strsbstr(string, "ENDOFLIST"); //index holds position of first occurence of "ENDOFLIST" within the string
while(index != -1) //loop through the rest of the string until the final "ENDOFLIST" is found
{
location = index + location + strlen("ENDOFLIST");
index = strsbstr(string + location, "ENDOFLIST");
}
/*
the variable 'location' now holds the position of the final char of the last occurence of "ENDOFLIST" within the string
and 'location - strlen("ENDOFLIST")' would yield the position of the first char of the last occurence of "ENDOFLIST"
within the string
*/
free(string);
return 0;
}
我敢肯定,许多经常访问C
本网站部分的人今天早些时候都看过这篇文章。我只是想获得一些意见,如果这可以解决提问者遇到的问题,并且它是否可行。
即使实际上考虑它,我几乎 100% 肯定 IRC 通道无论如何不能具有相同的名称,因此甚至可能不需要循环。它应该只需要在第一次之后再次检查字符串中是否出现“ENDOFLIST”吗?