簡體   English   中英

在C ++中將字符串轉換為int的問題

[英]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

指向str中整數表示形式后的第一個字符的指針存儲在endptr指向的對象中。

因此,基本上,條件檢查數字之后的字符串中是否還有其他字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM