c - 在数组中存储和检索字符和整数的组合

标签 c arrays

我想创建一个数组,我可以在其中存储运行时提供的输入,例如 - + 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/

相关文章:

c - Mosquitto - 订阅一个经纪人并使用 C 推送到另一个经纪人

C:使用 realloc() 转储核心

c - 整数的“字符数组”到 'Integer array'

javascript - jQuery 检查数组中字母是否可用

c - 在输出屏幕中打开图像文件

c - 如何使用预处理器缩短这些行?

java - 有没有办法检查数组是否使用默认值或指定值?

java - 检查字符串数组中的字符不重复

javascript - 获取对象数组中每一天的最新日期?

c - C的命令行交互式外壳