我不明白为什么下面的代码会返回*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)
答案 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)
&lt; --- think errno
部分可能是遗留代码。它本来可以在某个时候使用,但是使用它的代码可能已被删除,但errno
已被遗忘。你是对的,它什么都不做,可能会被优化掉。errno
是一个局部变量(秘密编辑?)
end
是
所以基本上条件检查字符串后面是否有其他字符。