1

式のユーザー入力 (例: 2 * (6-1) + 2 ) を取得し、結果を出力する必要がある C++ 割り当てを行っています。ユーザー入力でスペースが検出されない限り、すべてが正しく機能します。

ユーザー入力を次のメソッドに渡す必要があります。

double Calculate(char* expr);

この問題を克服する方法はわかりませんが、スペース文字が終端のヌル バイトとして機能する c_str() が原因で問題が発生していることは認識しています。

理想的には、スペース文字を保持したいのですが、スペースは式では何の役にも立たないため、単純に削除することにしました。c_str の代わりに string::data を使用すると、同じ結果が得られます。

int main(int argc, char **argv)
{
    string inputExpr;
    Calc myCalc;

    while(true) {
        cin >> inputExpr;
        if(inputExpr == "q") break;

        cout << "You wrote:" << (char*)inputExpr.c_str() << endl; // debug
        printf("Result: %.3f \n\n", myCalc.Calculate( (char*)temp.c_str() ) );
    }
    return 0;
}
4

3 に答える 3

8

c_str は問題なく動作します。あなたの問題はcin >> inputExpr. 演算子は次の>>スペースまでしか読み取らないため、方程式を完全には読み取れません。

使いたいのはstd::getlineです:

std::getline (std::cin,inputExpression);

改行文字に到達するまで読み取ります。特定の区切り文字が必要な場合は、関数の説明を参照してください。

于 2014-04-08T13:08:11.673 に答える
0

まず、入力(読み取り専用)パラメーターである必要があるため、Calculate()メソッドはconst char*文字列を入力として受け取る必要があると思います。expr

double Calculate(const char* expr);

を使用する場合、 const-ness を削除するために醜いキャストなしでconst char*単純に呼び出すことができることに注意してください。std::string::c_str()

そして、これは C++ であり C ではないため、以下を使用std::stringすると便利です。

double Calculate(const std::string& expr);

空白も読み取るという特定の問題については、これはNULバイトの終了の問題ではありません。スペースはNUL. 単純なオーバーロードの代わりに
使用して、文字列の読み取り方法を変更する必要があります。std::getline()std::cin >>

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string line;
    getline(cin, line);
    cout << "'" << line << "'" << endl;
}

このコードをコンパイルして実行し、 のようなものを入力するとHello World、文字列全体が出力として取得されます (2 つの単語を区切るスペースを含む)。

于 2014-04-08T13:57:40.840 に答える
0

inputExpr.c_str() や c_str 自体には問題はありません。c_str() は、null で終了するシーケンスを含む文字配列へのポインターを返します。cin を読んでいると、複数の文字列として区切られたスペースやタブなどが表示されます。その方法で文字列の内容を確認して、意図した操作を解決します

于 2014-04-08T13:14:19.360 に答える