#include <stdio.h>
/**
*******************************************************************************
* @brief 查找逗号位置偏移量 函数
* @param [in] *str 字符串指针
* @param [in] cx 从*str里面得到第cx个逗号所在的位置
* @return 0~0XFE,代表逗号所在位置的偏移; 0XFF,代表不存在第cx个逗号
* @note
*******************************************************************************
*/
unsigned char CommaPosOffset(char *str, unsigned char cx)
{
char *p = str;
while(cx)
{
if( (*p=='*') || (*p<' ' ) || ('z'<*p) )return 0xFF; //遇到'*'或者非法字符,则不存在第cx个逗号
if(*p==',')cx--;
p++;
}
return p - str;
}
/**
*******************************************************************************
* @brief 字符串转数字 函数
* @param [in] *str 字符串指针
* @param [in] len 从*str里面要转换的字符个数
* @return 转换数值
* @note
*******************************************************************************
*/
double StringToNumber(char* str, char len)
{
char* p = str;
char maskNegative = 0; //负数标记
char mulIntegral = 10; //整数倍数
double mulDecimal = 1; //小数倍数
double result = 0;
while(len--) //限定转换长度,若以特殊结束符 结束,此长度大于结束符便宜长度即可
{
if(*p == '-'){p++; len--; maskNegative = 1;} //是负数
if(*p == '.'){p++; len--; mulIntegral = 1;} //遇到小数点了
if( (*p<'0') || ('9'<*p) ){break;} //有非法字符 或 结束符号 ','、 '*'
if(mulIntegral == 1)mulDecimal *= 0.1; //小数倍数改变
result = (result * mulIntegral) + ((*p-'0') * mulDecimal); //字符转数值
p++;
}
if(maskNegative) result = -result; //处理负数
return result;
}
/**
*******************************************************************************
* @brief 主 函数
* @param [in] None
* @return None
* @note
*******************************************************************************
*/
int main(void)
{
char a[] = "$GNGLL,-2239.37849,N,11400.75600,E,123254.00,A,A*7F";
unsigned char pos;
pos = CommaPosOffset(a, 1); //查找逗号位置
printf("逗号偏移量:%d \n", pos);
printf("数值1:%d \n", (char)StringToNumber(&a[pos], 2) );
printf("数值2:%d \n", (char)StringToNumber(&a[pos+2], 2) );
printf("数值3:%f \n", StringToNumber(&a[pos+4], 3) );
printf("数值4:%f \n", StringToNumber(&a[pos], 30) );
}
运行结果: