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

时间:2011-04-03 06:50:45

标签: c++ string programming-languages

我有一个应用程序,我得到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”

感谢大家的帮助。

7 个答案:

答案 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()报告在结尾之后是否有任何可以解析为整数。