该计算器应该在网页文本框中输入带空格的输入内容(例如“ 2 2”),然后回显上方的答案.当前,输出为“ 0”,或者看似会从输入中裁剪掉一个随机数.
我95%确信问题出在substr函数内-它们没有被分配正确的值.由于输出行为,这是我的猜测.展示,
1 1将= 0
2 2将= 0
…
9 9将= 0
10 10将= 1
20 20将= 2
注意:从第16行开始的$firstNumber,$secondNumber和$operator初始声明值是任意的.
以下是PHP手册中的substr(,)示例:
echo substr('abcdef', 1); // bcdef <br>
echo substr('abcdef', 1, 3); // bcd<br>
echo substr('abcdef', 0, 4); // abcd<br>
echo substr('abcdef', 0, 8); // abcdef<br>
echo substr('abcdef', -1, 1); // f<br>
.
//'if' is executed when submit is pressed
if (isset($_POST['test']))
{
$input = $_POST['test'];
$answer = calculate($input);
echo $answer;
}
//does string processing and number calculation
function calculate($input)
{
//declarations (random)
$firstNumber = 20;
$secondNumber = 30;
$operator = "+";
$answer = 7;
//string processing.
for($i = 0; $i <= strlen($input); $i++)
{
//if current position of the string scan is an operator,
if( trim(substr($input, $i, $i + 1), " ") == "+" ||trim(substr($input, $i, $i + 1), " ") == "-"
||trim(substr($input, $i, $i + 1), " ") == "*" ||trim(substr($input, $i, $i + 1), " ") == "/")
{
//then
//$operator = current position TO current position + 1
$operator = substr($input, $i, $i + 1);
//trim $operator
$operator = trim($operator, " ");
//$firstNumber = 0 TO current position - 1
$firstNumber = substr($input, 0, $i - 1);
//trim $operator
$firstNumber = trim($firstNumber, " ");
//$secondNumber = current position + 1 TO end of string
$secondNumber = substr($input, $i + 1, strlen($input));
//trim $operator
$secondNumber = trim($secondNumber, " ");
}
}
//if operator is ... then do that operation.
//example: if "+", then add $firstNumber and $secondNumber
if($operator == "+")
{
$answer = $firstNumber + $secondNumber;
}
else if($operator == "-")
{
$answer = $firstNumber - $secondNumber;
}
else if($operator == "*")
{
$answer = $firstNumber * $secondNumber;
}
else if($operator == "/")
{
$answer = $firstNumber / $secondNumber;
}
//return the calculated answer for echo
return $answer;
}
?>
<form action="test.PHP" method="POST">
<textarea name="test" rows="3" cols="30"></textarea>
<input type="submit" value="calculate!">
</form>
解决方法:
您的问题是您使用substr.
substr取一个字符串,一个起始位置和一个长度.这是您滥用的长度.在浏览输入字符串时,您正在增加要查找的子字符串的长度.由于运算符的长度为1,因此您应该使用
//if current position of the string scan is an operator,
if( trim(substr($input, $i, 1), " ") == "+" || trim(substr($input, $i, 1), " ") == "-"
||trim(substr($input, $i, 1), " ") == "*" || trim(substr($input, $i, 1), " ") == "/")
{
....
您还需要在此处更新代码:
//$operator = current position TO current position + 1
$operator = substr($input, $i, 1);
//trim $operator
$operator = trim($operator, " ");
您可以通过做一些简化
potentialOperator = trim(substr($input, $i, 1), " ")
并将其与您支持的操作符进行比较.这样可以为您节省多个不必要的修整和替换操作
这也意味着您只能一次识别一次运算符.
您可能还想查看带有PREG_SPLIT_DELIM_CAPTURE的preg_split来解析输入字符串,而不是逐字符扫描它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。