我怎样才能更聪明?

时间:2013-12-06 12:04:08

标签: c

我必须从字符串中读取并提取一些值。 这些值的编码如下:

k="11,3,1" v="140.3" 

我已经定义了代码并创建了包含所有字段的结构以及存储k和v的临时结构。在{{​​1}} proc中,我将值从temp结构转移到右结构(使用有效类型) 。 它有效,但我有很多字段,fillFields需要很多fillFields。也许有人可以给我任何暗示如何更聪明地写它。

现在简化的代码:

if-conditions

1 个答案:

答案 0 :(得分:1)

不是将文本值保存在pElem中,而是保存转换后的值。

这会在解析k="11,3,1" v="140.3"时创建一个额外的步骤,将文本转换为枚举类型,但它只需支付一次。 fillFields()调用然后运行更简单。假设您有更多ticP个变量,那就是胜利。

typedef enum pElem_type {
  pElem_None, pElem_ASK, pElem_BID, pElem_CLOSE, pElem_N
} pElem_type;

typedef struct pElem {
  pElem_type type;
  float value;
} pElem;

void fillFields(ticP t, const pElem *p) {
  switch (p->type) {
  case pElem_ASK:
    printf("ASK %f\n", p->value);
    t->ask = p->value;
    break;
  case pElem_BID:
    printf("BID %f\n", p->value);
    t->bid = p->value;
    break;
  case pElem_CLOSE:
    printf("Close %f\n", p->value);
    t->close = p->value;
    break;
  default:
    printf("Error\n");
  }
}


// Further simplifications possible
typedef struct tic {
  float field[pElem_N];
}tic, *ticP;

static const char *FieldName[pElem_N] = {
  "None", "ASK", "BID", "Close"
};

void fillFields(ticP t, const pElem *p) {
  if (p->type < pElem_N) {
    printf("%s %f\n", FieldName[p->type], p->value);
    t->field[p->type] = p->value;
  }
}