我想创建一个数组,我可以在其中存储运行时提供的输入,例如 - + 2 * 3 4/12 6
(此处共有 9 个元素)。假设没有一个输入实例需要数组中超过 50 个索引。为此,我正在考虑一个整数数组,但我没有得到任何格式说明符,它可以在 scanf()
中用于获取输入(终止于 return/Enter keypress ),这样我就可以区分程序中的后者是特定索引是 char 还是 int 以及它的值是什么。
如果我使用 %c
或什至 getchar()
函数,我将面临处理多于一位数的整数的麻烦。
如果我使用 %d
字符,例如 * + -/不会被存储。等等。
如果可行,请提出一些方法。
最佳答案
当我学习编程时(很久以前......)我的老师说“在通过正确的分析明确你想要实现的目标之前,永远不要开始编码”。如果我理解正确的话,你正在构建一个计算器,只有五个运算符 (+-/*%) 遵循以下语法:
expr : number
| operator expr expr
with the following lexical tokens :
operator: single character among +-*/%
number: consecutive sequence of decimal digits ([0-9]*)
not printing characters (space, tab, \r, \n) are used as delimiters or otherwise ignored
any other character causes an error.
好的:这就是您当前的规范,如果您稍后想使用十进制数字,您只需更改数字定义以允许一个可选的小数点。
这样写,用lex和yacc会很容易,但是对于这么简单的语法,肯定是大材小用了。
即使我们将空格定义为分隔符,也不可能使用 scanf
来获取标记,因为它会默默地吃掉 +
符号:+12 与 12 相同.
因此,您必须使用返回标记的 getc
构建一个简单的词法分析器,然后构建一个递归计算表达式的解析器。不需要在数组中存储任何东西:
typedef struct _token {
enum {OPERATOR, INT, END, ERROR } type;
union {
int ival;
char op;
} value;
} TOKEN;
TOKEN getToken(FILE *fdin) {
static const char valid_op[] = "+-*/%";
static const char spaces[] = " \t\r\n";
int c;
TOKEN tok;
int val = 0;
int isval = 0;
while ((c = getc(fdin)) != EOF) {
if ((c >= '0') && (c <= '9')) {
val = 10 * val + (c - '0');
isval = 1;
}
else if (isval != 0) {
tok.type = INT;
tok.value.ival = val;
ungetc(c, fdin);
return tok;
}
else if (strchr(valid_op, c)) {
tok.type = OPERATOR;
tok.value.op = c;
return tok;
}
else if (! strchr(spaces, c)) {
tok.type = ERROR;
return tok;
}
}
tok.type = END;
return tok;
}
int parse(FILE *fdin, int *typ) {
int i, j;
*typ = INT;
for(;;) {
TOKEN tok = getToken(fdin);
if (tok.type == INT) {
return tok.value.ival;
}
else if (tok.type == OPERATOR) {
i = parse(fdin, typ);
if (*typ != INT) {
*typ = ERROR;
return 0;
}
j = parse(fdin, typ);
if (*typ != INT) {
*typ = ERROR;
return 0;
}
switch(tok.value.op) {
case '+': return i+j;
case '-': return i-j;
case '*': return i*j;
case '/': return i/j;
case '%': return i * j / 100;
}
}
else {
*typ = tok.type;
return 0;
}
}
}
关于c - 在数组中存储和检索字符和整数的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27896133/