我有一个包含" 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
我找到了几种解决方案,但它们在速度和编码方面都不能满足我的要求。 有人会想到一个漂亮而优雅的解决方案,分享给我吗?!
谢谢
答案 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
}