在字符串中查找单个字符

时间:2013-01-25 09:56:13

标签: c++

我有一个包含" 0123456789?"的字符串。我想

- if first char is not ' ' or '?' and the rest is " ", return the first char
- if last char is not ' ' or '?' and the rest is " ", return the last char
- if the string is only " ", return -1
- and else, return -2

我找到了几种解决方案,但它们在速度和编码方面都不能满足我的要求。 有人会想到一个漂亮而优雅的解决方案,分享给我吗?!

谢谢

2 个答案:

答案 0 :(得分:1)

这看起来像往常if ... else if ... ... else ... 链。一些可能有用的功能:

  • std::string::front()std::string::back()获取 第一个或最后一个字符,

  • std::find_if检查空格。如果这个功能 返回结束迭代器,找不到值。

如果您可以使用C ++ 11(如果您是学生,您可能可以;如果 你在工业界工作,你可能不能。),最优雅 std::find_if的解决方案可能是lambda。所以:全部 字符串除了第一个字符是白色空格 是:

std::find_if(
    s.begin() + 1,
    s.end(),
    []( char ch ) { return ! isspace( static_cast<unsigned char>( ch ) ); }
    ) == s.end();

除了第一个或所有之外的所有内容,只需更改迭代器。

在使用之前,不要忘记检查空字符串 front()back(),或对迭代器进行任何算术运算。

答案 1 :(得分:0)

这是怎么回事?

stringtest(string &s)
{
    if(string.length()<1)
    return -2
    std::string begin(' ?');
    if(begin.find(s.front())>1)
    //test if first character of s is in begin
    {
        unsigned found = s.find_first_not_of(' ',1)
        //checks if there are any other char then ' ' after the first char
        if(found >s.length())
        return s.at(0);
    }
    else if(begin.find(s.back())>1)
    //test if last character of s is in begin
    {
        unsigned found = s.find_last_not_of(' ',s.length()-1);
        //checks if there are any other char then ' ' before the last char
        if(found !=std::string::npos)
        return s.at(s.length()-1);
    }
    if(s.length()==1 && s.front()== ' ')
    return -1
    else return -2
}