2017-04-14 129 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如果输入所有数字。这显然是倒退。

我想也许你的意思是写||而不是?