C++中字符串到int转换的问题

Sha*_*aju 2 c++ string programming-languages

我有一个应用程序,我得到一个vector<string>.我需要迭代向量中的每个元素,看看值是否是整数值.

虽然向量表示字符串,但很少有元素可以包含整数.我需要弄清楚哪些元素是整数,如果元素是整数,我需要它的值.如果向量中的元素是一个字符串,那么我就忽略它.

我尝试使用atoi(vector[index].c_str()),但我有一个问题.atoi如果字符串中包含的值是整数,则返回整数值.如果不是,则返回0

所以,请考虑以下事项:

atoi("Shankar") = 0
atoi("0") = 0
Run Code Online (Sandbox Code Playgroud)

atoi("123") = 123
atoi("123Shankar") = 123
Run Code Online (Sandbox Code Playgroud)

那么,我如何区分上述案例呢?如果使用atoi无法实现这一点,那么这个问题的替代解决方案是什么?

请协助.

编辑:

我可以循环遍历字符串并查看每个字符是否都是整数,但这会降低性能,因为对于平均为n个字符的m个字符串,我需要检查m X n次,这使得它成为O(n ^ 2).

有没有更好的方法来解决这个问题?

编辑2:

不幸的是,我不能使用任何第三方库,只使用STL

编辑3:

在我的应用程序中,向量不包含任何负整数,所以我正在考虑Xeo的解决方案,因为sstream不区分"123"和"123Shankar"

谢谢大家的帮助.

Xeo*_*Xeo 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑
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;
}
Run Code Online (Sandbox Code Playgroud)