繁体   English   中英

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

[英]C++ c_str() doesn't return complete string

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

c_str工作正常。 您的问题是cin >> inputExpr >>运算符只读取直到下一个空格,因此您不会完全读取方程式。

您要使用的是std :: getline

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

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

问题不在于inputExpr.c_str()和c_str这样,c_str()返回指向包含以空终止的序列的字符数组的指针。 在阅读cin时,您会得到空格或制表符等分隔为多个字符串的信息。 检查与字符串内容相符的方法以解决预期的操作

首先,我认为您的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 ,则将获得整个字符串作为输出(包括将两个单词分隔开的空格)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM