2014-04-08 5 views
1

Я выполняю назначение C++, которое требует ввода пользователем выражения (например: 2 * (6-1) + 2) и вывода результата. Все работает правильно, если в пользовательском входе не встречается пробел.C++ c_str() не возвращает полную строку

Необходимо передать пользовательский ввод следующему методу;

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; 
} 
+1

Проблема не в том, что вы думаете. Пространство не совпадает с завершающим нулем. –

ответ

8

c_str работает просто отлично. Ваша проблема: cin >> inputExpr. Оператор >> читает только до следующего места, поэтому вы полностью не читаете свое уравнение.

То, что вы хотите использовать std::getline:

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

, который будет читать, пока он не достигнет символа новой строки. См. Описание функции, если вам нужен конкретный разделитель.

+3

, но в любом случае расточительно делать 'cout << (char *) inputExpr.c_str()' когда 'cout << inputExpr' будет достаточно ... и было бы неплохо, если бы его' myCalc.Calculate' принимает 'std :: string' вместо' char * '(особенно потому, что' c_str() 'возвращает' const char * ', а не' char * '...) – Massa

+1

также следует использовать cout of printf. Но я думаю, он услышит это от своих наставников в любом случае :) – MatthiasB

+0

Ты абсолютно прав, спасибо! Я потратил так много времени на отладку и исследование c_str * facepalm * – AgentOrange

0

Проблема не с inputExpr.c_str() и c_str как таковая, c_str() возвращает указатель на массив символов, который содержит последовательность с нулевым завершением. При чтении через cin вы получаете пробел или вкладку и т. Д., Разделяя их на несколько строк. Проверьте с содержимым строки таким образом, чтобы решить намеченную операцию

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 байт: пространство является не 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, вы получаете всю строку в качестве вывода (включая пространство, разделяющее два слова).

Смежные вопросы