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

C++ c_str() doesn't return complete string

本文关键字:返回 字符串 str C++      更新时间:2023-10-16

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

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

double Calculate(char* expr);

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

理想情况下,我想保留空格字符,但我会简单地删除它们,因为空格在表达式中没有任何作用。当使用字符串::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 nn", 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(),而不需要任何难看的强制转换来删除常量。

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