函数功能
字符串格式:type=0&u=user1&p=pass1
结构体格式:
typedef struct{
unsigned int len;
char *data;
}STRING_S;
最终将0、user1、pass1存入到结构体STRING_S中
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SUCCESS 0
#define FAILED -1
/*该枚举主要为了说明字符串有几组数据,便于最后打印使用:该例子总有type、name、pass三组数据*/
typedef enum en_GetAuthInfoPos
{
GETAUTHINFOPOS_TYPE = 0,
GETAUTHINFOPOS_NAME,
GETAUTHINFOPOS_PWD,
GETAUTHINFOPOS_MAX,
}GETAUTHINFOPOS_TYPE_E;
/*该结构体用于存放字符串的值:data存数据起始位置,len存数据长度(例如该例子中name字段的data是user1&p=pass1,name字段的len是5)*/
typedef struct{
unsigned int len;
char *data;
}STRING_S;
int String_parseDataFromClient(char *pcDataFromClient, int iLen, STRING_S *pastrAuthInfo)
{
int i = 0;
int j = 0;
char *pcPos = NULL;
for(i = 0, pcPos = pcDataFromClient; i <= iLen; i++)
{
if('=' == pcPos[i])
{
pastrAuthInfo[j].data = &pcPos[i] + 1;
}
if(('&' == pcPos[i]) || (i == iLen))
{
pastrAuthInfo[j].len = &pcPos[i] - pastrAuthInfo[j].data;
j++;
}
}
return SUCCESS;
}
int main(int argc, char **argv)
{
int iLen = 0;
char *pcDataFromClient = "type=0&u=user1&p=pass1";
STRING_S astrAuthInfo[GETAUTHINFOPOS_MAX] = {{0}};
printf("%s\n\n", pcDataFromClient);
iLen = strlen(pcDataFromClient);
if(SUCCESS != String_parseDataFromClient(pcDataFromClient, iLen, astrAuthInfo))
{
printf("String_parseDataFromClient() error !\n");
return FAILED;
}
int j = 0;
for(j; j < GETAUTHINFOPOS_MAX; j++)
{
printf("astrAuthInfo[%d].data=%s astrAuthInfo[%d].len=%d\n", j, astrAuthInfo[j].data, j, astrAuthInfo[j].len);
}
return 0;
}
结果显示
[root@localhost svn]# ./chaifen_zifuchaun
type=0&u=user1&p=pass1
astrAuthInfo[0].data=0&u=user1&p=pass1 astrAuthInfo[0].len=1
astrAuthInfo[1].data=user1&p=pass1 astrAuthInfo[1].len=5
astrAuthInfo[2].data=pass1 astrAuthInfo[2].len=5