【问题标题】:how to remove leading lower case letters, underscores from a string in c++?如何从c ++中的字符串中删除前导小写字母,下划线?
【发布时间】:2014-04-17 12:10:46
【问题描述】:

这里我有一个字符串,但我只需要删除小写字母,即 mi。

原始代码是:

bool check(char c) { return !(std::isdigit(c) ||std::isalpha(c)); }

int main() {

    std::string  str = "m_ivecCadCurveEdges_Pattern";

    str.erase(std::remove_if(str.begin(), str.end(), check),str.end());

    for (std::string::size_type i=0; i<str.length(); ++i)
    {
       //if (!std::islower(str.at(i) && str.at(i) != '_')
       if (!std::islower(str.at(i)))
        {
            str.erase(0, i);
            break;
        }
    }

    if (std::isdigit(str.at(0)))
        str= "N" + str;

    std::cout<<str;
}

一旦循环到达字符串中的 B,我想打破循环。

【问题讨论】:

  • 用户 remove_if 后跟擦除。
  • @juanchopanza 不确定它是否会在字符串正确的情况下工作,因为删除不是我想要的方式..
  • @shivi 那么你应该更好地解释你想要什么。再次阅读问题的标题。

标签: c++ string lowercase


【解决方案1】:

erase-remove 如果您希望处理整个字符串,则很好,但您要求只更改前导小写字符。为此,只需更改您的“if”代码:

if (!std::islower(str.at(i))
{
    str.erase(0, i);
    break;
}

你的 cout 应该在 for 循环之后。

【讨论】:

  • 感谢它的工作.. 但如果是像“m_ivecCadCurveEdges_Feature”这样的字符串......它只是删除了 m..:( 任何想法..??
  • @shivi 你只需要编辑if 语句来捕捉你不想删除的第一个字符,所以如果你也想去掉下划线:if (!std::islower(str.at(i) &amp;&amp; str.at(i) != '_') { ...
  • @shivi “奇怪的事情”信息不足以让我提供帮助。您为什么不在 ideone.com 上发布您当前的完整程序,然后在此处复制/粘贴 URL,以便我可以看到您在做什么,或者将其附加到您的问题中? (您应该将当前代码留在那里,以便人们可以看到您最初提出的问题并理解答案)
  • @Tonyd 但这将比我在回答中提出的解决方案复杂得多。执行 find_if 和擦除将是线性的,而您的解决方案将是前缀长度的线性倍
  • @IvayloStrandjev 实际上,我的代码是最佳的......它线性搜索,这是必要的,然后对字符串的前导部分发出一个擦除调用,这将从它们的每个剩余字符中复制原来的位置直接到他们的最终位置。您的答案的第二部分(在您意识到它是需要擦除的前导位之后)执行相同的处理,但使用 find_if 而不是 shlvl 的手动编码循环......没有区别 - 但 !islower 与 isupper 不同,所以您的逻辑有点坏了,但是 shlvl 没有澄清要擦除的前导字符。
【解决方案2】:

看标题我建议你使用remove_ifislower的组合。但是,问题正文暗示您可能只需要删除小写字符的最长前缀。如果是这种情况,您将需要 std::string#erasefind_if 的组合用于 isupper

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2018-05-18
    • 2010-12-08
    • 2015-12-05
    • 2012-10-12
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多