-4

我有一个包含“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

我找到了几个解决方案,但没有一个在速度和良好的编码方面让我满意。谁能想到一个漂亮而优雅的解决方案,可以分享给我吗?!

谢谢你

4

2 回答 2

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()or之前检查空字符串back(),或者在迭代器上进行任何算术运算。

于 2013-01-25T10:11:44.230 回答
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
} 
于 2013-01-25T10:25:06.237 回答