我正在尝试创建一个计算器来解决不同长度的算术表达式(例如2 + 3/4或7 * 8/2 + 12-14),我想知道是否有可能这样做而没有使用字符串。
我找到了无数的教程,解释了如何制作一个只有两个数字和一个算子的简单计算器,我还发现了使用sscanf和字符串来获取输入的例子。
但是,我的问题是:有没有办法(甚至可能)在不使用字符串的情况下获得可变长度输入?
起初我以为我可以简单地添加更多说明符:
int num1 , num2, num3;
char op1, op2;
printf("Please enter your equation to evaluate: ");
scanf("%d%c%d%c%d", &num1, &op1, &num2, &op2, &num3);
但显然,这对于长度超过3个数字或少于3个数字的等式不起作用。 我也在考虑使用某种递归函数,但如果我需要预先考虑整个方程式,我不知道如何做到这一点?
答案 0 :(得分:0)
如果您打算从用户输入或命令行参数中读取ASCII,那么在字符串世界中你就是不可避免的。你可以做的是尽早将它们转换成别的东西。
您可以完全放弃ASCII并定义二进制文件格式。
例如,您可能会说每对两个字节都是一个标记。第一个字节是元素类型(有符号整数,无符号整数,浮点数,运算符),第二个字节是值。
伪代码:
while(!done) {
int type = read(f);
int value = read(f);
switch(type) {
case TYPE_INTEGER:
push_to_stack(value);
break;
case TYPE_FLOAT:
push_to_stack_as_float(value);
break;
case TYPE_OPERATOR:
execute_operator(value);
break;
}
}
相当为什么你会强迫自己沿着这条路走下去,我不知道。您可能会发现自己想编写一个程序将ASCII输入转换为二进制文件格式;哪个会使用字符串。那你为什么一开始就逃避弦乐?
答案 1 :(得分:0)
你可以创建一个struct列表,每个struct都必须包含一个值或一个子列表,一个operator(char?)和一个对下一个(和之前)char的引用。
然后您只需向用户询问一个数字(或“(”/“)”)和一个操作符号。每个数字+运算符都是列表中的新元素,每个(是一个子列表,每个)都是返回上级列表(你甚至可以不创建一个子列表,但是在运行中详细说明并返回结果,如递归函数)
还可以详细说明结构和代码以支持多个参数。