0

早些时候有人发布了一个关于他们正在为 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”吗?

4

0 回答 0