3

这个计算器应该在网页文本框中输入带有空格的输入(如“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>
4

1 回答 1

4

你的问题是你使用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), " ")

并将其与您支持的运营商进行比较。这将为您节省多次不必要的调用trimsubstr 这也意味着您只需一次识别操作员。

您可能还想查看preg_splitwithPREG_SPLIT_DELIM_CAPTURE来解析输入字符串,而不是逐个字符地扫描它。

于 2012-08-01T17:41:17.073 回答