我有一个相当复杂的计算器,当用户输入“;”时会打印输出 (并按回车键。)我现在要做的是允许用户在按回车键时打印输出,(不使用分号。)我需要知道如何实现这一点。
旁注:计算器使用标记化来读取用户输入
这是计算器源代码的一部分,也是唯一需要更改的部分。它是 Token_stream 的成员函数,当计算器的各种其他函数调用以获取下一个令牌时调用它。
const char let = '#';
const char quit = 'Q';
const char print = ';';
const char number = '8';
const char name = 'a';
const char sq_rt = '@';
const char power = '^';
const char constant = '~';
Token Token_stream::get()
{
if (full) { full=false; return buffer; }
char ch;
cin >> ch;
switch (ch) {
case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
case '%':
case ';':
case '=':
case ',':
case constant:
case power:
case sq_rt:
case let:
case quit:
case name:
return Token(ch); // let each character represent itself
case '.':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{ cin.unget(); // equivalent of putback
double val;
cin >> val;
return Token(number,val);
}
default:
if (isalpha(ch)) { // in order to create variable names
string s;
s += ch;
while(cin.get(ch) && (isalpha(ch) || isdigit(ch) || ch == '_')) s += ch;
cin.unget();
if (s == "const") return Token(constant);
if (s == "quit") return Token(quit);
if (s == "pow") return Token(power);
if (s == "sqrt") return Token(sq_rt);
if (s == "let") return Token(let);
if (s == "name") return Token(name);
return Token(name,s);
}
else if (isspace(ch)) { // my attempt at allowing enter to produce output
string s;
cin.get(ch);
s += ch;
if(s == "\n") return Token(print);
}
}
error("Bad token");
}
到目前为止,如果用户输入 5*5 并点击空格然后输入..没有任何反应。但是,如果他们点击空格,然后输入一个随机字符(任何字符,而不仅仅是 ;)然后按 Enter,它就会输出答案。在此之后,用户可以使用 enter 产生输出,但是它保存了用户在敲击空格后输入的额外令牌,因此操作顺序变得很混乱。
简而言之,我需要知道如何让用户最初点击空格然后输入(甚至只是输入,但现在使用空格并输入)以产生输出 - 没有任何额外的字符。
如果您想查看更多来源或对计算器本身有任何疑问以解决问题,我很乐意发布更多信息。
PS 原始程序来自我正在学习 C++ 的一本书。我一直在做一些改变它并为其添加功能的练习。