前几天写GPS模块串口程序的时候遇到了一点小问题,GPS模组上传的数据量大且结构复杂,单片机中又没有上位机中的字符切割函数,琢磨了半天自己写了个切割函数。
本算法中兼具匹配和切割的功能,可以匹配指定的标志并按照指定分隔符将指定的部分切割出来。代码如下
string MatchStr(char temp[], const char target[], const char cutFlag)
//待匹配字符串,目标字符串,切割符号
{
int loc = 0; int i = 0;
char Reslut[100] = { '\0' };//暂存字符串
do
{
while (temp[loc] == target[i] && temp[loc] != cutFlag && target[i] != '\0')
{
loc++;
i++;
}
if (target[i] == '\0') //匹配成功,开始转录
{
int j = 0;
while (temp[loc] != cutFlag)
{
Reslut[j] = temp[loc];
j++;
loc++;
}
Reslut[j + 1] = '\0';//终止符
break;
}
else
i = 0; //标志回位
loc++;
if (temp[loc] == '\0')
break; //防止没有匹配字符串造成内存泄露
} while (temp[loc] != cutFlag || target[i] != '\0');
string x = Reslut;
return x;
}
代码思路如下:
首先设置一个位置标识来对待检字符串进行遍历,直至检到第一个与目标字符串匹配的字符后进入检测循环。
do
{
//内嵌检测模块,转录模块
loc++;
} while (temp[loc] != 'cutFlag');
最外层使用do-while结构而不使用while结构可以让循环跳过开头的隔断符。
当进入检测循环后,对待检字符串和目标字符串进行双循环,直至目标字符串完成检测或待检字符串和目标字符串不匹配。
while (temp[loc] == target[i] && temp[loc] != cutFlag && target[i] != '\0')
{
loc++;
i++;
}
完成检测循环后进入判断语句,如果是因为不匹配导致的退出,此时目标字符串并未行进置结尾符,故出现此类情况不进行转录,否则就进行转录且将待检目标的指示器回位。
if (target[i] == '\0') //匹配成功,开始转录
{
int j = 0;
while (temp[loc]!='cutFlag')
{
Reslut[j] = temp[loc];
j++;
loc++;
}
Reslut[j + 1] = '\0';//终止符
break;
}
else
i = 0;//标志回位
转录完成后一定要给结果字符串加一个结尾符号,而且一定要用break跳出最外层的遍历循环,否则下面的loc++会让待检字符串越界。
最后我们直接返回结果字符串即可。
以GNGGA为目标,$为切割符检测效果如下:
以N为目标,以 , 为切割符的检测效果如下: