3

この計算機は、Webページのテキストボックスにスペースを含む入力(「2 + 2」など)を入力し、その上に回答をエコーすることになっています。現在、出力は「0」であるか、入力から乱数を切り取っているように見えます。

問題はsubstr関数内にあると95%確信しています-正しい値が割り当てられていません。これは、出力動作のための私の推測です。実証するために、

1+1意志=02+2意志=0... 9+9意志=010+10意志=120+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), " ")

サポートされている演算子と比較します。trimこれにより、への不要な呼び出しを複数回節約できますsubstr 。また、オペレーターを1回だけ識別することも意味します。

また、charごとにスキャンするのではなく、入力文字列を解析するためにpreg_splitwithを確認することもできます。PREG_SPLIT_DELIM_CAPTURE

于 2012-08-01T17:41:17.073 に答える