实用于单片机的C++字符串切割匹配算法

        前几天写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为目标,以 , 为切割符的检测效果如下:

你可能感兴趣的:(算法与C++,IoT,单片机,嵌入式硬件)