我有一个应用程序,我得到vector<string>
。我需要迭代向量中的每个元素,看看值是否为整数值。
虽然向量表示字符串,但很少有元素可以包含整数。我需要弄清楚哪些元素是整数,如果元素是整数,我需要它的值。如果向量中的元素是一个字符串,那么我就忽略它。
我尝试使用atoi(vector[index].c_str())
,但我遇到了问题。如果字符串中包含的值是整数,则atoi
返回一个整数值。如果不是,则返回0
所以,请考虑以下事项:
atoi("Shankar") = 0
atoi("0") = 0
和
atoi("123") = 123
atoi("123Shankar") = 123
那么,我如何区分上述案例呢?如果使用atoi无法实现这一点,那么这个问题的替代解决方案是什么?
请协助。
修改:
我可以遍历字符串并查看每个字符是否都是整数,但这会降低性能,因为对于平均为n个字符的m个字符串,我需要检查m X次,这使得它成为O(n ^ 2 )。
有没有更好的方法来解决这个问题?
EDIT2 :
不幸的是,我不能使用任何第三方库,只使用STL
EDIT3 :
在我的应用程序中,向量不包含任何负整数,因此我正在考虑Xeo的解决方案,因为sstream不区分“123”和“123Shankar”
感谢大家的帮助。
答案 0 :(得分:5)
只需查看字符串并检查每个字符是否为整数。如果没有,则爆发并报告错误。
bool IsDigit(char c){
return '0' <= c && c <= '9';
}
bool IsInteger(std::string const& str){
size_t i = 0;
if(*str == '-') ++i;
for( ; i < str.size(); ++i){
if(!IsDigit(str[i]))
return false;
}
// all chars are integers
return true;
}
修改强>
atoi
并没有真正做任何其他事情。请参阅此示例实现:
int StrToInt(char const* str){
int ret = 0, sign = 1;
if(*str == '-'){
sign = -1;
++str;
}
while(IsDigit(*str)){
ret *= 10; // make room for the next digit
ret += ((*str) - 0x30); // convert char to digit
++str;
}
return ret * sign;
}
答案 1 :(得分:3)
尝试使用istringstream
int value;
std::istringstream iss(yourvector[i]);
if(iss >> value)
std::cout<<"value is not null"<<std::endl;
答案 2 :(得分:3)
您可以使用sscanf:
if(sscanf(s, "%d", &i) == EOF){
// error
}
或使用c ++:
string s = "111";
stringstream ss(s);
int i;
if((s >> i).fail()){
//error
}
答案 3 :(得分:3)
std::string intStr("123");
std::string nonintStr("hello");
try {
int i = boost::lexical_cast<int>(intStr); //OK
int j = boost::lexical_cast<int>("nonintStr); //throws
}
catch (boost::bad_lexical_cast & e) {
}
答案 4 :(得分:2)
问题的本质要求每个字符串扫描每个字符 - 至少在发生故障之前。没有办法神奇地把整个字符串一目了然;必须首先发现任何会导致它不是字符串的字符。
如果您发现非字符串的一般模式 - 也许它们总是[数字] [字母]的形式 - 那么您可以首先快速检查字符串的最后一个字符以提前退出。对于性能很重要的类似函数,我先测试每个角落情况,然后在直接中间测试一个,然后迭代所有内容。
以下是一个例子:
bool IsStringValidInt( const std::string& str )
{
if( str.size() == 0 )
return false;
if( !isdigit( str[str.size() - 1] ) ||
!isdigit( str[str.size() / 2] ) )
return false;
size_t i = 0;
if( str[i] == '-' )
++i;
for( ; i < str.size(); ++i )
if( !isdigit( str[i] ) )
return false;
return true;
}
答案 5 :(得分:1)
一种方法是检查每个字符串的每个字符以查看它是否为数字(使用isdigit)
答案 6 :(得分:1)
使用sscanf()
核对的正确方法如下:
int val;
char dummy;
if (sscanf(str, "%d%c", &val, &dummy) == 1) {
... // "val" contains the string's integer value
} else {
... // the string does not contain an integer
}
重要的是,格式字符串中的%c
组件会导致sscanf()
报告在结尾之后是否有任何可以解析为整数。