如何从尾部反向转换C ++字符串?

时间:2012-06-18 06:35:46

标签: c++ strtok

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

char* p = rstrtok(str, delimeters);

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

我只关心 delimeters 及其位置,(不是之间的内容),所以我想boost::split_iterator不合适。< / p>

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

(我搜索“反向strtok”,但只是“堆叠流过”到“流过堆栈”的东西......)

3 个答案:

答案 0 :(得分:8)

您可以使用strrchr滚动自己。

如果您使用C ++样式std::string,则可以使用string::find_last_of

答案 1 :(得分: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 */
}

答案 2 :(得分: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