C 我怎样才能做得更聪明?

C 我怎样才能做得更聪明?,c,C,我必须从字符串中读取并提取一些值。 这些值的编码如下: k="11,3,1" v="140.3" 我已经定义了代码,并创建了带有all字段的struct以及一个临时字段,其中存储了k和v。在fillFieldsproc I中,将值从临时结构传输到右侧结构(使用有效类型)。 它可以工作,但我有很多字段,fillFields需要有很多,如果条件是。也许有人能给我一些提示,告诉我如何写得更聪明 简化代码现在: #define ASK "11,3,1

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

k="11,3,1" v="140.3" 
我已经定义了代码,并创建了带有all字段的struct以及一个临时字段,其中存储了k和v。在
fillFields
proc I中,将值从临时结构传输到右侧结构(使用有效类型)。 它可以工作,但我有很多字段,
fillFields
需要有很多
,如果条件是
。也许有人能给我一些提示,告诉我如何写得更聪明

简化代码现在:

   #define ASK                       "11,3,1"
   #define BID                       "11,2,1"
   #define CLOSE                     "3,1,1"


    typedef struct tic {

      float ask;
      float bid;
      float close;
    }tic, *ticP;
    typedef struct pElem {
      char       * k;
      char       * v;
    }pElem, *pElemP;

    void fillFields(ticP t, pElemP p)
    {
      if (strcmp( ASK, p->k)==0)
      {
        printf ("ASK %s\n", p->v);
        t->ask = atof(p->v);
      }
      if (strcmp( BID, p->k)==0)
      {
        printf ("BID %s\n", p->v);
        t->bid = atof(p->v);
      }
      if (strcmp( CLOSE, p->k)==0)
      {
        printf("CLOSE >>>%s<<<\n", p->v)    ;
        t->close =  atof (p->v);
      }
    }
#定义询问“11,3,1”
#定义标书“11,2,1”
#定义关闭“3,1,1”
类型定义结构{
浮动问;
浮动投标;
浮动关闭;
}tic,*ticP;
typedef结构pElem{
char*k;
char*v;
}pElem,*pElemP;
空隙填充区(ticP t、pElemP p)
{
if(strcmp(ASK,p->k)==0)
{
printf(“询问%s\n”,p->v);
t->ask=atof(p->v);
}
如果(strcmp(投标,p->k)==0)
{
printf(“投标%s\n”,p->v);
t->bid=atof(p->v);
}
如果(strcmp(关闭,p->k)==0)
{

printf(“关闭>>>%s而不是将文本值保存在
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;
  }
}
typedef枚举类型{
没有,问,出价,收盘,N
}pElem_型;
typedef结构pElem{
pElem_型;
浮动值;
}佩勒姆;
空心填充域(ticP t,const pElem*p){
开关(p->类型){
案例pElem_问:
printf(“询问%f\n”,p->value);
t->ask=p->value;
打破
案例pElem_投标:
printf(“投标%f\n”,p->value);
t->bid=p->value;
打破
案件已结案:
printf(“关闭%f\n”,p->value);
t->close=p->value;
打破
违约:
printf(“错误\n”);
}
}
//进一步简化是可能的
类型定义结构{
浮动字段[pElem_N];
}tic,*ticP;
静态常量字符*字段名[pElem\u N]={
“无”、“询问”、“出价”、“结束”
};
空心填充域(ticP t,const pElem*p){
如果(p->typetype],p->value);
t->字段[p->类型]=p->值;
}
}

关于“智能代码”的定义多种多样,经常引起争议;-)关于工作代码的问题应该放在codereview网站上。你可以使用“else”!如果是“ASK”,你可以删除与BID的比较并关闭。查看yacc(1),这可以大大简化解析代码。我附带的代码已经简化。但是tic struct有很多字段,并且不是每个字段都是float类型。@如果您的字段有不同的类型,请使用相同的方法。我假设没有很多不同的类型,但是有很多字段。在字符串到枚举之后,使用该枚举来解析与枚举值一起的每种类型的值。任务的许多方面没有发布(例如,“并非每个字段都有类型浮点”),这会引导进一步的建议,但要点是尽可能折叠类似的编码。枚举类型帮助很大。