最近做项目,需要用到字符串转整型,因为字符串是有可能任意的,所以转整型的时候要先对字符串进行判断。
网上所用的字符串转整型大概有:atoi ,正则表达式,stoi, sscanf等等。
网上所用的字符串转整型大概有:atoi ,正则表达式,stoi, sscanf等等。
atoi 原型:
int atoi(const char *nptr);
参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。
atoi的一个比较麻烦的缺点是,它是错误返回零的,当输入的字符串为空,或者是“0000”、“-000000”、“+0000”时它无法区分,这就要求我们在输入之前对字符串进行过滤,至今我没想到比较好的方法可以解决这个问题。
正则表达式:
C++正则表达式的使用需要加入
#include <regex>头文件,下面的是一个用法,判断是否符合邮箱格式:
bool is_email_valid(const std::string& email)
{
const std::regex pattern("(\\w+)(\\.|_)?(\\w*)@(\\w+)(\\.(\\w+))+");
return std::regex_match(email, pattern);
}
网上的C++正则表达式的用法很多,详细可以查看http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438215.html
而我们的string to int的正则表达式大概有这几种(自己没很认真的学过,不知道里面有没有错误的地方,但是运行了第一个,结果是正确的)
(@"^[+-]?/d*$");
(@"^[+-]?/d*[.]?/d*$");
( @"^/d*[.]?/d*$");
正则表达式能比较好的达到我们需要的目的,而且代码逻辑也相当简单,但是不够完美的地方是,它造成的开销会比较大,相对于stoi、atoi和sscanf,它的开销是其它开销的几倍,当然,如果对性能要求不高的话,我推荐是使用这个。而我自己所做的东西对性能要求比较高,所以最后没有采纳这种方法。
stoi 原型:
int stoi( const string& _Str, size_t *_Idx = 0, int _Base = 10 );stoi同atoi差不多,返回也是一个整型数,第二个参数_Idx返回时包含首个未转换字符的索引,所以可以利用第二个参数来过滤掉“123abc”或者“12 789”(中间有空格)这种情况,转换后判断下_Idx是否指向原来字符串的结尾即可,例子如下:
string str;
size_t index;
intValue = stoi(str, &index);
if (index != str.size())
return false;
if (index != str.size())
return false;
但是stoi并没有提供错误返回值,当字符串无法转化为整型时(比如str为“”,“abc”等),stoi会抛出系统的对象(throws an object ),也就是一个内存错误弹窗,这使人非常头疼,于是得事先加个判断,判断string的头两个字符是否为数字字符或者“+ -”加数字字符。
sscanf 原型:
int sscanf(
const char *buffer,
const char *format [,
argument ] ...
);
const char *format [,
argument ] ...
);
sscanf从字符串中读取格式化数据,每个函数返回成功转换并分配的字段数量;返回值不包括已读取但未分配的字段。 返回值为 0 表示未分配字段。 如果出现错误,或者,如果在第一个转换之前到达字符串的末尾,则返回值是 EOF。
用法跟scanf有点像,只不过将控制台的流输入换成一个字符串const char* buff而已,我的做法如下:
用法跟scanf有点像,只不过将控制台的流输入换成一个字符串const char* buff而已,我的做法如下:
result = sscanf(str, "%d%c", &intValue, &endChar);
if (endChar != '\0' || result < 1)
{
return false;
}
if (endChar != '\0' || result < 1)
{
return false;
}
这种方法主要是判断,str中能转换为整数的部分的下一个字符是否是"\0",如果非,则意味则str字符串中还有其他非数字字符,原字符串不是纯数字字符串。sscanf的方法也可以用来判断原字符串是不是纯数字字符串。
其他的string to int的方法还有很多,比如sprintf、stringstream等等,详细可以看:
由于功力还不够,其中绝对有不对或者遗漏的地方,欢迎指正。