本文共 964 字,大约阅读时间需要 3 分钟。
发现这个问题是在这段代码中:
size_t pos=urls.find_first_of('/',7); if(pos!=string::npos) len=pos-7; else len=urls.length()-7;
首先是find_first_of,int find_first_of(char c, int start = 0),这个函数是从字符串的start位开始寻找字符为c的第一个位置,找到返回该位置,否则返回-1;
关键是这个为什么要跟string::npos进行比较呢?
npos的原型应该是std::container_type::size_type,每一个容器类都会定义这个值,表示一个不存在的位,用于统一对容器查找结果的判断,如find函数,若没有找到相应的值,就会返回npos,大家只要判断find返回的值是不是等于npos,就能判断出,在该容器是不是存在该值,平时我们判断的时候,只是看find返回的值是否等于-1,若为-1则未找到,其实是因为string::pos为-1,故正确,但是放在其他容器就不一定是这样,故大家进行判断的时候最好用npos。
再例如://银行系统中的输入钱数时的验证函数
bool validateMoney(const std::string str, char ch)
{ if (str.length() >= 11 || (!isdigit(ch) && ch!= '.')) return false; bool findDot = false; size_t dotPos = std::string::npos; dotPos = str.find('.'); if (dotPos != std::string::npos) findDot= true; if (findDot) { if (ch == '.') return false;//不能出现两个点号 else if (str.length() - 1 >= dotPos + 2)//小数点后最多两位 return false; } else if (ch != '.'&&str.length() >= 8) //小数点前面最多8位 return false; return true;}转载地址:http://nfdii.baihongyu.com/