C ++ c_str()没有返回完整的字符串

时间:2014-04-08 13:04:53

标签: c++ string cin c-str

我正在进行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;
}

3 个答案:

答案 0 :(得分:8)

c_str工作得很好。您的问题是cin >> inputExpr>>运算符只会读到下一个空格,因此您不会完全读取等式。

您要使用的是std::getline

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

将读取直到它到达换行符。如果需要特定的分隔符,请参阅功能说明。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

double Calculate(const char* expr);

请注意,如果您使用const char*,则可以简单地调用std::string::c_str(),而不需要任何丑陋的强制转换来删除常量。

而且,由于这是C ++而不是C,使用std::string会很好:

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

关于读取空格的特定问题,这不是终止NUL字节的问题:空格 a NUL
您应该使用std::getline()而不是简单std::cin >>重载来更改读取字符串的方式:

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

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

如果您编译并运行此代码,并输入Hello World之类的内容,则会将整个字符串作为输出(包括分隔两个单词的空格)。