1

我正在做一个 C++ 赋值,需要用户输入一个表达式(例如: 2 * (6-1) + 2 )并输出结果。除非在用户输入中遇到空格,否则一切正常。

要求将用户输入传递给以下方法;

double Calculate(char* expr);

我知道这个问题是由 c_str() 引起的,其中空格字符充当终止空字节,但我不确定如何克服这个问题。

理想情况下,我想保留空格字符,但我会满足于简单地删除它们,因为空格在表达式中没有任何作用。使用 string::data 而不是 c_str 时,我得到了相同的结果。

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

问题不在于 inputExpr.c_str() 和 c_str 本身,c_str() 返回指向包含空终止序列的字符数组的指针。在通过 cin 阅读时,您会将空格或制表符等分隔为多个字符串。检查字符串的内容以解决预期的操作

于 2014-04-08T13:14:19.360 回答
0

首先,我认为您的方法应该将字符串Calculate()作为输入,因为应该是输入(只读)参数:const char*expr

double Calculate(const char* expr);

请注意,如果您使用const char*,您可以简单地调用std::string::c_str()而无需任何丑陋的演员表来删除 const-ness。

而且,由于这是 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内容,您将获得整个字符串作为输出(包括分隔两个单词的空格)。

于 2014-04-08T13:57:40.840 回答