[英]Problems converting a string to int in C++
我不明白為什么以下代碼返回*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)
建議使用stringstream是錯誤的嗎?
#include <sstream>
#include <string>
using namespace std;
bool isValue(const string &input, int &output)
{
stringstream ss;
ss << input;
return(ss >> output)
}
strtol
可以將全局變量errno
為某些代碼。 http://cplusplus.com/reference/clibrary/cstdlib/strtol/ 。
如果正確的值超出可表示值的范圍,則返回LONG_MAX或LONG_MIN,並將全局變量errno設置為ERANGE。
如果端點位於“ \\ 0”(字符串的結尾),則函數返回true,否則返回false。
最后,指向str中整數表示形式后的第一個字符的指針存儲在endptr指向的對象中
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
。
<---認為errno
部分可能是遺留代碼。 它可能在某個時候被使用過,但是使用它的代碼可能已被刪除,但是errno
被遺忘了。 沒錯,它什么也不做,可能會進行優化。 errno
是一個局部變量(隱身編輯?)
end
是
因此,基本上,條件檢查數字之后的字符串中是否還有其他字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.