在C ++中,更好的是没有Boost库,如何确保std :: string str包含一个数字或一个数字后跟'%'符号?如果它不属于这两种情况,则应发出错误。
答案 0 :(得分:1)
最简单的解决方案可能是转换字符串(使用strtol
或strtod
,取决于您期望的数字类型,然后查看
以下字符。类似的东西:
(已编辑以纠正错误处理):
bool
isNumberOrPercent( std::string const& value )
{
char const* end;
errno = 0;
strtod( value.c_str(), &end );
return errno == 0
&& (*end = '%' ? end + 1 : end) - value.c_str() == value.size();
}
答案 1 :(得分:1)
#include <iostream>
#include <string>
#include <algorithm>
#include <ctype.h>
bool is_a_bad_char(char c) {
return !(isdigit(c) || (c=='%'));
}
int main() {
std::string str = "123123%4141219";
if (std::find_if(str.begin(), str.end(), is_a_bad_char) != str.end()) {
std::cout << "error" << std::endl;
return 1;
}
return 0;
}
答案 2 :(得分:0)
find_first_not_of
包含所有数字和%
npos
,请检查最后一个字符%
。答案 3 :(得分:0)
不是很C ++ - 是的,但这样的事情会这样做:
#include <cstdlib>
#include <cstring>
bool checkformat(const std::string &s) {
const char *begin = s.c_str();
char *end;
double val = std::strtod(begin, &end);
if (end == begin) return false;
if (*end == '%') ++end;
return (end - begin == s.size());
}
请注意strtod
跳过初始空格,因此如果您不想接受带有初始空格的字符串,那么您需要单独拒绝该空格。它还接受"NAN"
,"INF"
,"INFINITY"
(所有不区分大小写),并且每个事件都以+
或-
开头,并且在这种情况下"NAN"
可选地跟随一些实现定义的字符以指示它代表的 NaN值。可以说“INF”是一个数字,但根据定义“NAN”不是,所以如果val != val
你想要返回false,也可能检查无穷大。
[编辑:我认为我已经解决了詹姆斯提出的问题,除了" "
和" %"
仍有争议。然后他补充了溢出。在他和我的回答之间,你应该明白这一点 - 首先决定你要如何对待每个边缘案例,然后对其进行编码。]