自助设备给系统返回应答报文,其中最后一个域是TAG格式的字符串,包含多条数据记录,每条记录格式规定如下:
券别|钞箱金额|回收箱金额|合计金额|
其中金额均为16位,小数点后2位。
记录与记录之间有一个分隔符'\n',在linux系统下ASCII码是0X0A,例如:
"纸币100元|500.00|0.00|500.00|\n纸币50元|500.00|0.00|500.00|\n纸币20元|500.00|0.00|500.00|\n"
由于要对字符串里的数据进行处理,所以现在写函数提取字符串中的数据。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct dataFormat{
char curType[15];
double boxAmt;
double cycAmt;
double totalAmt;
} *pDataFormat, DataFormat;
int main(int argc, char *argv[])
{
int i = 0;
char *p = NULL, *q = NULL;
char* teststr="纸币100元|500.00|0.00|500.00|\n纸币50元|500.00|0.00|500.00|\n纸币20元|500.00|0.00|500.00|\n";
char *tmpstr = NULL;
char tmp_box[17];
char tmp_cyc[17];
char tmp_total[17];
DataFormat rcvdata[10];
memset(tmp_box, 0x00, sizeof(tmp_box));
memset(tmp_cyc, 0x00, sizeof(tmp_cyc));
memset(tmp_total, 0x00, sizeof(tmp_total));
memset(rcvdata, 0x00, sizeof(DataFormat)*10);
p = teststr;
while(1)
{
q = strstr(p,"\n");
if(q != NULL)
{
printf("length:q-p=%d\n", q-p);
tmpstr = malloc(q-p+1);
strncpy(tmpstr, p, (q-p));
*(tmpstr+strlen(tmpstr)) = '\0';
printf(tmpstr);
printf("\n");
sscanf(tmpstr, "%[^|]|%[^|]|%[^|]|%[^|]|",rcvdata[i].curType, tmp_box, tmp_cyc, tmp_total);
// strtrim(rcvdata[i].curType);
rcvdata[i].boxAmt = atof(tmp_box);
rcvdata[i].cycAmt = atof(tmp_cyc);
rcvdata[i].totalAmt = atof(tmp_total);
printf("%s,%.2f,%.2f,%.2f\n", rcvdata[i].curType, rcvdata[i].boxAmt, rcvdata[i].cycAmt, rcvdata[i].totalAmt);
p = q+1;
i++;
}
else
{
break;
}
}
return 0;
}
编译运行:
gcc -o teststr teststr.c
./teststr
最终运行结果如下: