Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-如果用户输入错误,如何验证计算器的用户输入?_C#_Winforms_Calculator - Fatal编程技术网

C#-如果用户输入错误,如何验证计算器的用户输入?

C#-如果用户输入错误,如何验证计算器的用户输入?,c#,winforms,calculator,C#,Winforms,Calculator,我正在用c#制作一个简单的计算器应用程序,我遇到了一个问题,如果用户输入例如“4**3”,程序就会崩溃。是否有任何方法验证输入,以便在用户输入无法计算的内容时将其标记 string sum = textDisplay.Text; DataTable dt = new DataTable(); var ans = dt.Compute(sum, ""); 按照Tim的建议,使用Try/Catch块。显然,这会告诉您尝试后是否失败,但异常确实会提供一些信息: string op

我正在用c#制作一个简单的计算器应用程序,我遇到了一个问题,如果用户输入例如“4**3”,程序就会崩溃。是否有任何方法验证输入,以便在用户输入无法计算的内容时将其标记

string sum = textDisplay.Text;
DataTable dt = new DataTable();
var ans = dt.Compute(sum, "");

按照Tim的建议,使用Try/Catch块。显然,这会告诉您尝试后是否失败,但异常确实会提供一些信息:

string operation = "4**3";
DataTable dt = new DataTable();
try
{
    var ans = dt.Compute(operation, "");
    MessageBox.Show(ans.ToString());
}
catch (Exception ex)
{
    MessageBox.Show("Operation: " + operation + Environment.NewLine + ex.Message, "Operation Failed");
}  
上述结果:


如果你想知道在调用
Compute()
之前它是否会失败,你必须编写自己的语法分析器…这在某种程度上否定了使用
Compute()
的全部意义。

当然,添加一个
try…catch
一旦你有了一个操作符,只有当它是另一个操作符时才更改它。实际上,正则表达式可以简单地检查数字之间的一行中是否有两个或多个运算符,这是在调用
Compute()
之前捕获它的一种方法,但是的,捕获异常不需要任何工作。@insane_developer只取决于您的操作有多复杂。如果我们只有两个操作数,中间只有一个运算符,那就很容易了。例如,如果我们得到更复杂的带括号的表达式,那么正则表达式将很快变得复杂。对于参数,允许重复,
((5-4)*(1-5)
,请注意,
*
的左/右不再有任何数字。当然,但在表达式中添加括号不会太复杂。在括号的情况下,有一些定义良好的模式可供查找。不过,我仅能做到这一点来防止格式错误。您可以认为,如果必须使用try-catch不管怎样,你还是完全相信它吧。我想这都是有争议的。