先贴出源码,随后做解释
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//去除字符中的空格
void s_strim(char *str)
{
char *q = str;
while (*q)
{
if (*q != ' ')
{
*str++ = *q;
}
q++;
}
*str = '\0';
}
//拆分字符
char* spt(char* &str, char del)
{
if (!strchr(str, del))
{
return NULL;
}
char *ptr = str;
char *bf = strchr(str,del);
*bf = '\0';
str = bf + 1;
return ptr;
}
int main()
{
char str[] = "char:,char:,int:,int:,char:3:,char:4:,";
s_strim(str);
char* ptr = str;
char del_a = ',';
char del_b = ':';
char* spk_a;
char* spk_b;
int j;
while (spk_a = spt(ptr, del_a))
{
j = 0;
while (spk_b = spt(spk_a, del_b))
{
j++;
switch (j)
{
case 1:
{
printf("ONE: ");
printf("%s\t", spk_b);
break;
}
case 2:
{
printf("TWO: ");
printf("%s\t", spk_b);
int x = atoi(spk_b);
printf("x:%d\t", x);
break;
}
}
}
printf("\n");
}
getchar();
return 0;
}
为了减少理解上的困惑,用了别名,用c++编译器进行编译。如果用c编译器编译,应当将别名换成指针的指针。 关于对程序的理解、分析、优化随后进行。
难点在于结构体字段中,存在边长的字段,而该边长字段真正的长度,由另外的一个字段制定。在设置关于结构体的描叙字符串的时候,就需要对该字符串中该字段追加是由第几个字段指定该字段的长度。所以对于结构体描叙字符串的语义解析,要 做两次字符串的拆分处理。第一次解析出每个字段的所有描叙,然后再对每个字段的描叙进行进一步的拆分,找出由第几个指定本字段的长度,再代码中表现为两层的while嵌套。
对结构体的描叙字符串的处理做的很不理想,通过对字符串进行拆分然后对 每个字段的语义进行分析效率非常差劲,而且非常困难的一点,注意变长字段的长度描叙的分解应该倒叙进行,从后向前查找该变长字段的描叙 含义。利用双循环就是为了拿出这么个字段然后做下记录,然后再下一次的双循环中找出记录中的描叙下标在解析的时候进行压栈处理,在 遇到该字段的时候再出栈处理,效率非常的差劲,必须想出新的解析方式。
后继:
上面的代码是最初的思路模型,里面有大量的问题,尤其是对于字符串的分割,在原有字符串直接插入'\0'结束字符,一旦后续操作需要继续对字符进行处理,将会带来问题。解决方案是开辟char数组专门用于存放拆分后的字符串,然后返回,原有字符串不受影响。
结构体其实是段连续的内存空间,不过该连续内存空间存放的数据类型是不同的,而数组是相同类型的连续空间,enum,union,这些不再缀诉。
优化后的思路模型是这样 https://github.com/adofsauron/Decode/blob/master/Tes.h ,
这是主要的逻辑,还处于整理状态,完整的代码库需要不断的优化组合从可使用。