2017-04-14 126 views
-2

我試圖從用戶使用std :: string得到一個數字,並且想要先檢查該字符串是否爲空,並且它只包含數字,然後檢查數字是否高於比零0短路評估VS 2017 C++

當我建立它,只需按下輸入我得到一個異常未處理的無效參數在stoi函數。

我在VS(2012)的舊版本中嘗試它,並得到相同的錯誤。

短路評估是否適用於VS?

static const bool is_number(const char caracter) 
{ 
    return(caracter >= '0' && caracter <= '9'); 
} 

template <typename T> static const bool all_numbers(const T &str) 
{ 
    if (!str.empty()) 
    { 
     auto it = str.cbegin(); 

     if ((str.front() == '+' || str.front() == '-') && (str.size()>1)) ++it; 

     for (it; it != str.cend(); ++it) if (!is_number(*it)) return false; 

     return true; 
    } 
    else return false; 
} 

int main() 
{ 
    std::string str; 

    do 
    { 
     std::cout << " Number: "; 
     getline(std::cin, str); 
     std::cin.clear(); 

    }while (!all_numbers(str) && std::stoi(str) <= 0); 

    return 0; 
} 
+3

您採取了哪些步驟來解決您的問題? –

+0

我可以只添加另一個do-while,它會工作,但我想知道VS的短路是否工作? – Yaz

+1

當您遇到此結果時,您提供給您的程序的輸入是什麼? –

回答

2

當然,短路工作在Visual Studio中,你可以很容易地驗證了這一點。

然而,你的邏輯是錯誤的:

(!all_numbers(str) && std::stoi(str) <= 0); 

在這裏,我們只執行stoi如果輸入所有數字。這顯然是倒退。

我想也許你的意思是寫||而不是?