在C ++中将字符串转换为int的问题

时间:2012-08-21 14:54:45

标签: c++ string

我不明白为什么下面的代码会返回*end=='\0\'

bool isValue(const string &token,int &output_value) //czy string jest wartoscia
{
  char *end = 0;
  errno=0;
  output_value = strtol(token.c_str(),&end,10); //converts string to int
  if (errno!=0) return false;
  return *end=='\0';
}
编辑:愚蠢的问题,但我不知道为什么会有

bool isValue(const string &token,int &output_value)

而不是

bool isValue(string &token,int &output_value)

bool isValue(string token,int output_value)

4 个答案:

答案 0 :(得分:3)

建议使用stringstream会不合适?

#include <sstream>
#include <string>

using namespace std;

bool isValue(const string &input, int &output)
{
    stringstream ss;
    ss << input;
    return(ss >> output)
}

答案 1 :(得分:2)

strtol可以将全局变量errno设置为某些代码。 http://cplusplus.com/reference/clibrary/cstdlib/strtol/

如果正确的值超出可表示值的范围,则返回LONG_MAX或LONG_MIN,并将全局变量errno设置为ERANGE。

如果端点在'\ 0'(字符串的结尾),则函数返回true,否则返回false。

最后,指向str中整数表示后面的第一个字符的指针存储在endptr指向的对象中

答案 2 :(得分:1)

errno是一个古老的C hack。它是一个全局变量(今天是本地线程)。 如果存在(检测到的)错误,则strtol将其设置为非零值(和 如果没有错误,或者原始值不是,则不变 0-它的设计使你可以连接许多电话,和 只在最后检查。)

请注意,有问题的代码是错误的。 (我知道因为我最近 犯了同样的错误。出现错误时strtol的语义是 奇怪的是,温和地说。)你需要类似的东西:

bool
intValue( std::string const& token, int& toReturn )
{
    char* end = NULL;
    char const* s = token.c_str();
    errno = 0;
    long results = strtol( s, &end, 10 );
    bool error = errno != 0
        || end != s
        || *end == '\0'
        || results <= std::numeric_limits<int>::max()
        || results >= std::numeric_limits<int>::min();
    if ( !error ) {
        toReturn = results;
    }
    return error;
}

请注意1)您必须确保end != s; 2)你必须 范围检查结果是否写入int。 WRT 首先,strtol的规范说如果找不到 它要转换的字符(即字符串不包含任何数字) 返回0,将end设置为字符串的开头,不进行修改 errno

答案 3 :(得分:0)

errno部分可能是遗留代码。它本来可以在某个时候使用,但是使用它的代码可能已被删除,但errno已被遗忘。你是对的,它什么都不做,可能会被优化掉。&lt; --- think errno是一个局部变量(秘密编辑?)

end

  

a pointer to the first character following the integer representation in str is stored in the object pointed by endptr.

所以基本上条件检查字符串后面是否有其他字符。