2

まず、これが世界で最もばかげた質問であるかどうかをお詫び申し上げます。しかし、私は困惑していて、こことグーグルの両方でたくさんの検索をしました。私は自分でC++を教えているので、何を検索するかを知るために必要な語彙を必要としない可能性があります。

方程式を解析するための有限状態マシンを作成しようとしています。私はそれが以前に行われたことを知っていますが、私は学ぼうとしています。そのために、文字列を取得して数値を認識し、それらをdoubleまたはfloatに変換できるようにしたいと考えています。(どのフォーマットを使用するかについてのアドバイスをおもてなしします。)

文字列をdoubleに変換する関数があります:

    double convertToDouble(string value)
{
    /* -- From http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2
        Using stringstream, convert a string to a double by treating it like a stream
    */
    istringstream stream(value);
    double doubleValue;
    stream >> doubleValue;
    return doubleValue;
}

そして、文字列内の次の数値を探す関数があります。

string evaluateNextValue (int operatorPosition, string equation)
{
    /* -- Find the next value
        My idea is that, since I'm using spaces as my dividers, we'll look for
        the first number and then, using insert to put the individual numbers
        into a string until a space is found again. Then, the numbers--now
        in the correct order--can be converted to a double and returned
    */
    bool digitFound = false;
    string workingNumbers;
    for (int pos = operatorPosition; pos < equation.size(); pos ++)
    {
        if (equation.at(pos) == ' ' && digitFound == true)
        {
            double result = convertToDouble(workingNumbers);
            cout << "Converting a string to " << result << endl;
            cout << "The result plus one is: " << result +1 << endl;
            return workingNumbers;
        } else if (equation.at(pos) == ' ' && digitFound == false)
        {
            cout << "Skipping a blank space." << endl;
            continue;
        } else
        {
            if (digitFound == false)
            {
                digitFound = true;
                cout << "First digit found." << endl;
            }
            cout << "Adding " << equation.at(pos) << " to the string." << endl;
            workingNumbers.insert(workingNumbers.end(),equation.at(pos));
        }
    }
}

そして、これは私が一種のテストとして両方を呼び出すために使用しているmain()です。

int main()
{
    string dataInput;
    cout << "Insert a number" << endl;
    getline(cin, dataInput);
    cout << "You entered: " << dataInput << endl;
    double numberValue = convertToDouble(evaluateNextValue(0, dataInput));

    cout << "Adding ten: " << numberValue + 10;
    return 0;
}

これが問題です。現在のように、evaluateNextValue()が文字列を返すので、機能します。私には少し不当に思えますが(すべてが不当に思えるかもしれませんが)、機能します。

コードに関数の変数resultを操作させると、正常に機能します。文字列をdoubleに変換するだけで、作業できます。

しかし、文字列をdoubleに変換して、doubleを返そうとすると。。。doubleは関数自体で正常に機能します。しかし、main()に到着したときはnanです。さらに奇妙な(またはとにかく奇妙な)のは、intを返そうとするとintが返されるという事実ですが、入力した値にリモートで接続されているものはありません。

私はあなたが提供することを気にかけているどんな助けにも感謝します。そして、これはここでの私の最初の投稿なので、私はどんなスタイルのポインターにもオープンです。

4

1 に答える 1

5

ループ条件がevaluateNextValue原因で文字列の最後に到達した場合、戻り値は未定義です(ステートメントがないため)。これにより、未定義の動作がトリガーされます。これには、NaN値の戻りが含まれる場合があります。forreturn

このようなエラーをキャッチするには、コンパイラの警告を有効にする必要があります。

于 2012-06-28T12:18:33.680 に答える