查找逗号位置偏移量函数(想省流就看本篇文章最后的代码)
这个函数能查找逗号,但是 最后一个逗号的后面的内容不好处理。
/**
*******************************************************************************
* @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;
}
int main()
{
char a[] = { "abc,defg,hijk" };
char n = 0;//第n个逗号的偏移量
n = CommaPosOffset(a,2);
printf("第二个逗号在数组a中的偏移量为:%d \r\n", n);
return 0;
}
证明第二个逗号的偏移量为9,这样就有很多的操作空间,例如取逗号左边的数据:
取逗号左边的数据
/**
*******************************************************************************
* @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;
}
int main()
{
char a[] = { " 1.0000, 23.2322,456.7777" };
char n1 = 0;//第n个逗号的偏移量
char n2 = 0;//第n-1个逗号的偏移量
char p = 0;//两个逗号相隔了多少偏移量
char i = 0;
char b[10] = { 0 };
n1 = CommaPosOffset(a,2);
printf("第二个逗号在数组a中的偏移量为:%d \r\n", n1);
n2 = CommaPosOffset(a, 1);
printf("第一个逗号在数组a中的偏移量为:%d \r\n", n2);
p = n1 - n2;
printf("两个逗号的地址相差了:%d \r\n", p);
for (i = 0; i < p-1; i++)//减一的目的是数组是从0开始的而不是1 可以试试不减,则最后带一个逗号
{
b[i] = a[n2 + i];//这个是要取第一个逗号之后,第二个逗号之前的字符值,所以需要加上n2的偏移量才能到第一个逗号结束的位置
}
printf("第二个逗号之前,第一个逗号之后的字符串为:%s\r\n",b);
return 0;
}
但是最后一个逗号的右边数据不好取所以加以改进:
其中 cx 输入
大于数组中逗号的值的时候会 输出错误
想要获得最后一个逗号n后面数据的偏移量也就是整个数组的偏移量则输入 n+1则可
/**
*******************************************************************************
* @brief 查找逗号位置偏移量 函数 如果只有2个逗号,要取第二个逗号的右边的偏移量则输入3
* @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;//传入的数组
char i = 0;
unsigned char lastCommaPos = 0;
unsigned char commaCount = 0;
unsigned char z = 0;//传入数组的最后一个偏移量
for (i = 0; str[i] != '\0'; i++)
{
z++;//跟着++到最后一个偏移量
if (str[i] == ',')
{
lastCommaPos = i;//最后一个逗号的a[i]的i值 也就是最后一个逗号的偏移量在哪
commaCount++;//计算有几个逗号
}
}
if (cx <= commaCount)//如果输入的逗号小于或等于buf的逗号数量则
{
while (cx)
{
if ((*p == '*') || (*p < ' ') || ('z' < *p))return 0xFF; //遇到'*'或者非法字符,则不存在第cx个逗号
if (*p == ',')cx--;
p++;//p进行偏移
}
return p - str;//P偏移后的数值-数组初始值 = 偏移量 例如偏移了5个字节
}
else if (cx == commaCount + 1) //如果输入的是最后一个逗号+1:表示想获取最后一个逗号的右边的数值则
{
printf("数值:%d ", &p[z] - str);
return &p[z] - str;//取最后一个偏移量的地址-数组初始值 = 整个数组的大小
}
else if(cx > commaCount+1)//如果cx不符合条件则
{
printf("你输入的逗号数量有误\r\n");
return 0xFF;
}
}
所以获取逗号之前的某个数值的整体函数:
#include <stdio.h>
#include <stdlib.h>
/**
*******************************************************************************
* @brief 查找逗号位置偏移量 函数 如果只有2个逗号,要取第二个逗号的右边的偏移量则输入3
* @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;//传入的数组
char i = 0;
unsigned char lastCommaPos = 0;
unsigned char commaCount = 0;
unsigned char z = 0;//传入数组的最后一个偏移量
for (i = 0; str[i] != '\0'; i++)
{
z++;//跟着++到最后一个偏移量
if (str[i] == ',')
{
lastCommaPos = i;//最后一个逗号的a[i]的i值 也就是最后一个逗号的偏移量在哪
commaCount++;//计算有几个逗号
}
}
if (cx <= commaCount)//如果输入的逗号小于或等于buf的逗号数量则
{
while (cx)
{
if ((*p == '*') || (*p < ' ') || ('z' < *p))return 0xFF; //遇到'*'或者非法字符,则不存在第cx个逗号
if (*p == ',')cx--;
p++;//p进行偏移
}
return p - str;//P偏移后的数值-数组初始值 = 偏移量 例如偏移了5个字节
}
else if (cx == commaCount + 1) //如果输入的是最后一个逗号+1:表示想获取最后一个逗号的右边的数值则
{
printf("数值:%d ", &p[z] - str);
return &p[z] - str;//取最后一个偏移量的地址-数组初始值 = 整个数组的大小
}
else if(cx > commaCount+1)//如果cx不符合条件则
{
printf("你输入的逗号数量有误\r\n");
return 0xFF;
}
}
/**
*******************************************************************************
* @brief CTD获取压力值 ///以逗号的方式分割CTD的数值,并且获得到相应字符 (后续需要用字符串转数字函数进行转换才能进行计算 函数在下面!!)
* @param [in] *str 字符串指针
* @param [in] cx 从*str里面得到第cx个逗号所在的位置
* @return 0~0XFE,代表逗号所在位置的偏移; 0XFF,代表不存在第cx个逗号
* @note
*******************************************************************************
*/
double CTD_P(char* buf)
{
char i = 0;
char b[100] = { 0 };//这个BUF取决于传入进来的BUF有多大 越大越好
char p = 0;//逗号之间的偏移量
double c;
p = CommaPosOffset(buf, 3) - CommaPosOffset(buf, 2);//P=小数点3的偏移量-小数点2的偏移量 例如15-13=2 第二个小数点在13 第三个小数点在15
for (i = 0; i <= p - 1; i++)
{
b[i] = buf[CommaPosOffset(buf, 2) + i];//b数组中的值=某个小数点后面的偏移量+现在数字的偏移量
}
printf("压力字符数值为:%s\r\n", b);
c = atof(b); //将字符串类型转换成浮点数类型
printf("压力数字值为num = %lf\r\n", c);
return c;
}
int main()
{
double c = 0;
char a[] = {" 26.9174, 5.0069, 87.1011, 31.4417"};//一定不要忘记这是字符型记得加双引号
c = CTD_P(a);
printf("C = %lf", c);
return 0;
}