6

我想我需要一个反向版本的 strtok,比如:

char* p = rstrtok(str, delimeters);

例如,在字符串“hello+stack_over-flow”中使用分隔符集“+_-”依次获取和的位置'-''_''+'

我只关心分隔符和它们的位置,(而不是之间的内容),所以我猜boost::split_iterator这里不合适。

我可以利用任何现有的实用功能吗?或任何解决这种情况的解决方案?
此外,由于我正在使用 C++,是否有任何方便的方法来避免这种老式 C?

(我搜索了“反向 strtok”,但只是得到“堆栈溢出”到“堆栈溢出”的东西......)

4

3 回答 3

8

您可以使用strrchr.

如果你使用 C++ 风格std::string,你可以利用string::find_last_of.

于 2012-06-18T06:40:39.833 回答
3

你可以这样做strpbrk

char string[] = "hello+stack_over-flow";

char *pos = string;
while (*pos != '\0' && (pos = strpbrk(pos, "+-_")) != NULL)
{
    /* Do something with `pos` */

    pos++;  /* To skip over the found character */
}
于 2012-06-18T06:42:01.063 回答
0

strtok 在最基本的版本中非常简单——最多几百行。如果你用谷歌搜索“strtok filetype:c”,你可以看到它是如何在各种库中实现的。

一个非常幼稚的解决方案是先反转字符串,然后执行 strtok()。虽然这对长字符串不利,但如果您需要性能,请使用您自己的 strtok()。

像这样的东西:

void reverse(char* dest, const char* src)
{
    int len = strlen(src);
    int i;
    for(i = 0; i < len; ++i)
        dest[len-i-1] = src[i];
}

编辑:

巧合的是,我昨天在谷歌搜索的标签中打开了这个 Dobbs 博士页面:http ://www.drdobbs.com/conversations-al-go-rithms/184403801

于 2012-07-04T17:24:30.807 回答