【问题标题】:How to reversely strtok a C++ string from tail to head?如何从尾到头反向strtok C++字符串?
【发布时间】:2012-06-18 06:35:45
【问题描述】:

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

char* p = rstrtok(str, delimeters);

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

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

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

(我搜索了“reverse strtok”,但只是将“stack over flow”改为“flow over stack”的东西......)

【问题讨论】:

  • 我不认为有一个函数可以为你做到这一点。我认为你应该使用循环。

标签: c++ strtok


【解决方案1】:

您可以使用strrchr 自行滚动。

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

【讨论】:

  • 感谢@dirk,string::find_last_of 很好,但我每次都必须迭代分隔符的集合;并比较距离,看看谁离尾巴最近。
  • @Lyn:您的问题中没有指定。您可以编辑您的问题并发布您想要的确切作为输出(可能带有一些示例)吗?
  • 我想我要为自己辩护了...示例和输出是“例如,依次获取字符串中的'-',''和'+'的位置“你好+stack_over-flow" 使用分隔符集 "+-"";另外,我想我们都想以一种繁重且容易出错的方式做事。
  • @Lyn:*你必须比较距离的部分...... * 不存在。这与防守无关。这是关于优化你的时间和那些试图帮助你的人的时间。 FWIW,这个问题很可能已经结束,因为你没有告诉我们你尝试了什么。
【解决方案2】:

您可以使用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 */
}

【讨论】:

  • 谢谢@jo,我想我喜欢strpbrk,但有它的反向版本吗?或者我会先反转字符串并使用它。希望能通过代码审查...
  • @Lyn 据我所知,它没有反转版本,所以不幸的是你必须先反转字符串。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多