一. 前言 环境: windows、纯c\c++环境编程。
在文件、目录处理时,经常需要对文件名称、目录名称、文件后缀等数据做处理。在linux下比较方便。有basename可以直接调用,获取文件名称。windows下c、c++标准库里没有现成的函数可以直接提取文件名称、目录名称、剔除文件路径,下面就自己实现了几个方式完成文件名提取。
二. 实现代码-纯c/c++ 示例代码:
string path = c:\users\administ.1.2.3rator\desktop\text\data.22.txt; //string path = http://cqpc:8001/uploads/1/220512030806054762.mp4; //1.获取不带路径的文件名 string::size_type ipos; if (strstr(path.c_str(), \)) { ipos = path.find_last_of('\') + 1; } else { ipos = path.find_last_of('/') + 1; } string filename = path.substr(ipos, path.length() - ipos); cout <<获取不带路径的文件名:< 返回结果:
获取不带路径的文件名:data.22.txt 获取不带后缀的文件名:data.22 获取后缀名:txt 基本名称:data复制代码 三. c语言字符串处理案例 1. 计算空格、大小写字母 从键盘上输入一个字符串, 计算字符串里有多少个空格、小写字母、大写字母、数字。
#include //标准输入输出 #include //字符串处理头文件 int main(int argc,char **argv) { int len=0; int i; char str[100]; int cnt[5]={0}; //初始化赋值 //scanf(%s,str); //从键盘上录入字符串,字符串结尾: '\0' //gets(str); //从键盘上录入字符串 fgets(str,100,stdin); //从键盘上录入字符串 (标准输入) //空格、小写字母、大写字母、数字 其他数据 /*1. 计算字符串的长度*/ while(str[len]!='\0')len++; printf(len1=%d\n,len); printf(len2=%d\n,strlen(str)); //计算字符串长度 /*2. 处理字符串*/ for(i=0;i='a'&&str[i]='a'&&str[i]='0'&&str[i] 3. 字符串插入 字符串插入: “1234567890” 在第2个位置后面插入”abc” 最终结果: “12abc34567890”
#include //标准输入输出 #include //字符串处理头文件 int main(int argc,char **argv) { int i,j; int src_len; int new_len; /* 123456789 12 3456789 */ char src_str[100]=123456789; char new_str[]=abcd; int addr=2; //插入的位置 /*1. 计算字符串的长度*/ src_len=strlen(src_str); //123 new_len=strlen(new_str); /*2. 字符串移动*/ for(i=src_len-1;i>addr-1;i--) { src_str[i+new_len]=src_str[i]; //向后移动 new_len } /*3. 插入新的数据*/ for(i=0;i;i++)src_str[addr+i]=new_str[i];> 5. 字符串删除 字符串删除: “1234567890” 删除”456” 最终结果: “1237890”
示例: #include //标准输入输出 #include //字符串处理头文件 int main(int argc,char **argv) { char src_str[100]; char del_str[10]; int src_len=0,del_len=0; int i,j; int cnt=0; /*1. 录入字符串*/ printf(输入源字符串:); //123dufvdfv123dfljvb fgets(src_str,100,stdin); //从键盘上录入源字符串 printf(输入查找的字符串:); //123 fgets(del_str,10,stdin); //从键盘上录入源字符串 /*2. 计算长度*/ src_len=strlen(src_str); src_str[src_len-1]='\0'; src_len-=1; //src_len=src_len-1; del_len=strlen(del_str); //123\n =4 del_str[del_len-1]='\0'; del_len-=1; printf(源字符串:%s,%d\n,src_str,src_len); printf(删除字符串:%s,%d\n,del_str,del_len); /*3. 查找*/ for(i=0;i+1;i++)> 6. 字符串替换 字符串”1234567890” 将456替换为”888” 最终: “1238887890” 需要考虑3种情况复制代码 7. 字符串转整数。 从键盘上输入一个字符串”12345”, 得到整数: 12345;
#include //标准输入输出 #include //字符串处理头文件 int string_to_int(char str[]); int main(int argc,char **argv) { int data; char str[]=125abcd; data=string_to_int(str); printf(data=%d\n,data); return 0; } /* 函数功能: 字符串转为整数 字符转为整数: -48 或者 -'0' 1234 */ int string_to_int(char str[]) { int value=0; //存放转换之后的结果 int i=0; while((str[i]!='\0')&&(str[i]>='0'&&str[i]<='9')) { value*=10; value+=str[i]-'0'; i++; } return value; }复制代码 四、gps解码示例-字符串处理#include #include typedef unsigned char u8;typedef unsigned short u16;typedef unsigned int u32;const u8 gps_info_1[]=\$gngga,114955.000,2842.4158,n,11549.5439,e,1,05,3.8,54.8,m,0.0,m,,*4f\$gngll,2842.4158,n,11549.5439,e,114955.000,a,a*4d\$gpgsa,a,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37\$bdgsa,a,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2a\$gpgsv,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7b\$gpgsv,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7c\$gpgsv,3,3,10,31,50,287,36,32,66,018,*7f\$bdgsv,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62\$gnrmc,114955.000,a,2842.4158,n,11549.5439,e,0.00,44.25,061117,,,a*4d\$gnvtg,44.25,t,,m,0.00,n,0.00,k,a*14\$gnzda,114955.000,06,11,2017,00,00*47\$gptxt,01,01,01,antenna ok*35;const u8 gps_info_2[]=\$gpgsv,3,2,10,20,16,138,,21,27,204,,24,39,040,26,25,35,145,22*7b\$gpgsv,3,3,10,31,13,226,20,32,33,300,23*7f\$bdgsv,2,1,08,03,,,31,04,,,31,06,65,033,24,10,,,31*54\$bdgsv,2,2,08,11,,,30,12,,,30,13,,,29,15,,,31*6c\$gnrmc,144513.000,a,2856.3560,n,11524.5587,e,1.48,292.74,230817,,,a*7b\$gnvtg,292.74,t,,m,1.48,n,2.73,k,a*22\$gnzda,144513.000,23,08,2017,00,00*43\$gptxt,01,01,01,antenna ok*35\$gngga,144514.000,2856.3563,n,11524.5596,e,1,06,4.0,-13.0,m,0.0,m,,*68\$gngll,2856.3563,n,11524.5596,e,144514.000,a,a*40\$gpgsa,a,3,15,24,12,18,25,,,,,,,,6.7,4.0,5.3*3e\$bdgsa,a,3,06,,,,,,,,,,,,6.7,4.0,5.3*26\;#pragma pack(1) /* 必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐 *///美国gps卫星信息typedef struct{ u8 num; //卫星编号 u8 eledeg; //卫星仰角 u16 azideg; //卫星方位角 u8 sn; //信噪比 }nmea_slmsg;//北斗卫星信息typedef struct{ u8 beidou_num; //卫星编号 u8 beidou_eledeg; //卫星仰角 u16 beidou_azideg; //卫星方位角 u8 beidou_sn; //信噪比 }beidou_nmea_slmsg;//utc时间信息typedef struct{ u16 year; //年份 u8 month; //月份 u8 date; //日期 u8 hour; //小时 u8 min; //分钟 u8 sec; //秒钟}nmea_utc_time;//gps协议解析后数据存放结构体 typedef struct{ u8 svnum; //可见gps卫星数 u8 beidou_svnum; //可见gps卫星数 nmea_slmsg slmsg[12]; //最多12颗gps卫星 beidou_nmea_slmsg beidou_slmsg[12]; //暂且算最多12颗北斗卫星 nmea_utc_time utc; //utc时间 u32 latitude; //纬度 分扩大100000倍,实际要除以100000 u8 nshemi; //北纬/南纬,n:北纬;s:南纬 u32 longitude; //经度 分扩大100000倍,实际要除以100000 u8 ewhemi; //东经/西经,e:东经;w:西经 u8 gpssta; //gps状态:0,未定位;1,非差分定位;2,差分定位;6,正在估算. u8 posslnum; //用于定位的gps卫星数,0~12. u8 possl[12]; //用于定位的卫星编号 u8 fixmode; //定位类型:1,没有定位;2,2d定位;3,3d定位 u16 pdop; //位置精度因子 0~500,对应实际值0~50.0 u16 hdop; //水平精度因子 0~500,对应实际值0~50.0 u16 vdop; //垂直精度因子 0~500,对应实际值0~50.0 int altitude; //海拔高度,放大了10倍,实际除以10.单位:0.1m u16 speed; //地面速率,放大了1000倍,实际除以10.单位:0.001公里/小时 }gps_msg;u8 gps_getcommaoffset(u8 *buf,u8 cnt);void gps_msgshow(void);u8 gps_getcommaoffset(u8 *buf,u8 cnt);void gps_gpgsv_infoget(gps_msg *gps_decodeinfo,u8 *buf);void gps_gnvtg_infoget(gps_msg *gps_decodeinfo,u8 *buf);void gps_gnrmc_infoget(gps_msg *gps_decodeinfo,u8 *buf);void gps_gngsa_infoget(gps_msg *gps_decodeinfo,u8 *buf);void gps_bdgsv_infoget(gps_msg *gps_decodeinfo,u8 *buf);void gps_infoget(gps_msg *gps_decodeinfo,u8 *buf);gps_msg gps_decodeinfo; //存放gps解码信息int main(){ gps_infoget(&gps_decodeinfo,gps_info_2); gps_msgshow(); return 0;}const u8*fixmode_tbl[4]={失败,失败, 2d , 3d }; //fix mode字符串u8 dtbuf[50]; //打印缓存器/*函数功能:显示gps定位信息*/void gps_msgshow(void){ float tp; tp=gps_decodeinfo.longitude; sprintf((char *)dtbuf,经度:%.5f %1c,tp/=100000,gps_decodeinfo.ewhemi); //得到经度字符串 printf(%s\r\n,dtbuf); tp=gps_decodeinfo.latitude; sprintf((char *)dtbuf,纬度:%.5f %1c,tp/=100000,gps_decodeinfo.nshemi); //得到纬度字符串 printf(%s\r\n,dtbuf); tp=gps_decodeinfo.altitude; sprintf((char *)dtbuf,高度:%.1fm,tp/=10); //得到高度字符串 printf(%s\r\n,dtbuf); tp=gps_decodeinfo.speed; sprintf((char *)dtbuf,速度:%.3fkm/h,tp/=1000); //得到速度字符串 printf(%s\r\n,dtbuf); if(gps_decodeinfo.fixmode'9'||(*pslmsg[slx].eledeg=gps_strtonum(p1+posx,&dx);//得到卫星仰角 else break; posx=gps_getcommaoffset(p1,6+j*4); if(posx!=0xff)gps_decodeinfo->slmsg[slx].azideg=gps_strtonum(p1+posx,&dx);//得到卫星方位角 else break; posx=gps_getcommaoffset(p1,7+j*4); if(posx!=0xff)gps_decodeinfo->slmsg[slx].sn=gps_strtonum(p1+posx,&dx); //得到卫星信噪比 else break; slx++; } p=p1+1;//切换到下一个gpgsv信息 }}/*函数功能:分析bdgsv信息函数参数:gps_decodeinfo:nmea信息结构体 buf:接收到的gps数据缓冲区首地址*/void gps_bdgsv_infoget(gps_msg *gps_decodeinfo,u8 *buf){ u8 *p,*p1,dx; u8 len,i,j,slx=0; u8 posx; p=buf; p1=(u8*)strstr((const char *)p,$bdgsv); if(!p1)return; //没有查找成功 len=p1[7]-'0'; //得到bdgsv的条数 posx=gps_getcommaoffset(p1,3); //得到可见北斗卫星总数 if(posx!=0xff)gps_decodeinfo->beidou_svnum=gps_strtonum(p1+posx,&dx); for(i=0; ibeidou_slmsg[slx].beidou_num=gps_strtonum(p1+posx,&dx); //得到卫星编号 else break; posx=gps_getcommaoffset(p1,5+j*4); if(posx!=0xff)gps_decodeinfo->beidou_slmsg[slx].beidou_eledeg=gps_strtonum(p1+posx,&dx);//得到卫星仰角 else break; posx=gps_getcommaoffset(p1,6+j*4); if(posx!=0xff)gps_decodeinfo->beidou_slmsg[slx].beidou_azideg=gps_strtonum(p1+posx,&dx);//得到卫星方位角 else break; posx=gps_getcommaoffset(p1,7+j*4); if(posx!=0xff)gps_decodeinfo->beidou_slmsg[slx].beidou_sn=gps_strtonum(p1+posx,&dx); //得到卫星信噪比 else break; slx++; } p=p1+1;//切换到下一个bdgsv信息 }}/*函数功能:分析gngga信息函数参数: gps_decodeinfo:nmea信息结构体 buf:接收到的gps数据缓冲区首地址*/void gps_gngga_infoget(gps_msg *gps_decodeinfo,u8 *buf){ u8 *p1,dx; u8 posx; p1=(u8*)strstr((const char *)buf,$gngga); if(!p1)return; //没有查找成功 posx=gps_getcommaoffset(p1,6); //得到gps状态 if(posx!=0xff)gps_decodeinfo->gpssta=gps_strtonum(p1+posx,&dx); posx=gps_getcommaoffset(p1,7); //得到用于定位的卫星数 if(posx!=0xff)gps_decodeinfo->posslnum=gps_strtonum(p1+posx,&dx); posx=gps_getcommaoffset(p1,9); //得到海拔高度 if(posx!=0xff)gps_decodeinfo->altitude=gps_strtonum(p1+posx,&dx);}/*函数功能:分析gngsa信息参 数:gps_decodeinfo:nmea信息结构体 buf:接收到的gps数据缓冲区首地址*/void gps_gngsa_infoget(gps_msg *gps_decodeinfo,u8 *buf){ u8 *p1,dx; u8 posx; u8 i; p1=(u8*)strstr((const char *)buf,$gngsa); if(!p1)return; //没有查找成功 posx=gps_getcommaoffset(p1,2); //得到定位类型 if(posx!=0xff)gps_decodeinfo->fixmode=gps_strtonum(p1+posx,&dx); for(i=0; ipossl[i]=gps_strtonum(p1+posx,&dx); else break; } posx=gps_getcommaoffset(p1,15); //得到pdop位置精度因子 if(posx!=0xff)gps_decodeinfo->pdop=gps_strtonum(p1+posx,&dx); posx=gps_getcommaoffset(p1,16); //得到hdop位置精度因子 if(posx!=0xff)gps_decodeinfo->hdop=gps_strtonum(p1+posx,&dx); posx=gps_getcommaoffset(p1,17); //得到vdop位置精度因子 if(posx!=0xff)gps_decodeinfo->vdop=gps_strtonum(p1+posx,&dx);}/*函数功能:分析gnrmc信息函数参数:gps_decodeinfo:nmea信息结构体 buf:接收到的gps数据缓冲区首地址*/void gps_gnrmc_infoget(gps_msg *gps_decodeinfo,u8 *buf){ u8 *p1,dx; u8 posx; u32 temp; float rs; p1=(u8*)strstr((const char *)buf,$gnrmc);//$gnrmc,经常有&和gnrmc分开的情况,故只判断gprmc. if(!p1)return; //没有查找成功 posx=gps_getcommaoffset(p1,1); //得到utc时间 if(posx!=0xff) { temp=gps_strtonum(p1+posx,&dx)/gps_getpow(10,dx); //得到utc时间,去掉ms gps_decodeinfo->utc.hour=temp/10000; gps_decodeinfo->utc.min=(temp/100)%100; gps_decodeinfo->utc.sec=temp%100; } posx=gps_getcommaoffset(p1,3); //得到纬度 if(posx!=0xff) { temp=gps_strtonum(p1+posx,&dx); gps_decodeinfo->latitude=temp/gps_getpow(10,dx+2); //得到° rs=(float)(temp%gps_getpow(10,dx+2)); //得到' gps_decodeinfo->latitude=(u32)(gps_decodeinfo->latitude*gps_getpow(10,5)+(rs*gps_getpow(10,5-dx))/60);//转换为° } posx=gps_getcommaoffset(p1,4); //南纬还是北纬 if(posx!=0xff)gps_decodeinfo->nshemi=*(p1+posx); posx=gps_getcommaoffset(p1,5); //得到经度 if(posx!=0xff) { temp=gps_strtonum(p1+posx,&dx); gps_decodeinfo->longitude=temp/gps_getpow(10,dx+2); //得到° rs=(float)(temp%gps_getpow(10,dx+2)); //得到' gps_decodeinfo->longitude=(u32)(gps_decodeinfo->longitude*gps_getpow(10,5)+(rs*gps_getpow(10,5-dx))/60);//转换为° } posx=gps_getcommaoffset(p1,6); //东经还是西经 if(posx!=0xff)gps_decodeinfo->ewhemi=*(p1+posx); posx=gps_getcommaoffset(p1,9); //得到utc日期 if(posx!=0xff) { temp=gps_strtonum(p1+posx,&dx); //得到utc日期 gps_decodeinfo->utc.date=temp/10000; gps_decodeinfo->utc.month=(temp/100)%100; gps_decodeinfo->utc.year=2000+temp%100; }}/*函数功能:分析gnvtg信息函数参数:gps_decodeinfo:nmea信息结构体 buf:接收到的gps数据缓冲区首地址*/void gps_gnvtg_infoget(gps_msg *gps_decodeinfo,u8 *buf){ u8 *p1,dx; u8 posx; p1=(u8*)strstr((const char *)buf,$gnvtg); if(!p1)return; //没有查找成功 posx=gps_getcommaoffset(p1,7); //得到地面速率 if(posx!=0xff) { gps_decodeinfo->speed=gps_strtonum(p1+posx,&dx); if(dxspeed*=gps_getpow(10,3-dx); //确保扩大1000倍 }}/*函数功能:提取gps信息函数参数:gps_decodeinfo:nmea信息结构体 buf:接收到的gps数据缓冲区首地址*/void gps_infoget(gps_msg *gps_decodeinfo,u8 *buf){ gps_gpgsv_infoget(gps_decodeinfo,buf); //gpgsv解析-ok gps_bdgsv_infoget(gps_decodeinfo,buf); //bdgsv解析-ok gps_gngga_infoget(gps_decodeinfo,buf); //gngga解析-ok gps_gngsa_infoget(gps_decodeinfo,buf); //gpnsa解析-on gps_gnrmc_infoget(gps_decodeinfo,buf); //gpnmc解析-ok gps_gnvtg_infoget(gps_decodeinfo,buf); //gpntg解析-ok};>;>;>;>
;i++)src_str[addr+i]=new_str[i];>
新冠病毒疫情过后信息通信技术产业将呈现五大趋势
基于NumPy创建一个可以工作的神经网络
币币交易系统app开发公司,深圳币币交易所开发
国内3D打印形势一片大好
如何对脱硫管道进行防腐保护
(win)C、C++处理文件名称
当使用传统计算架构时功耗仍是一个巨大挑战
物联网行业智能解决方案推荐
PCB设计中会遇到的八种阻抗计算模型盘点
小米5X发布会在即:雷总亲自曝光小米5X真机,你家凡凡已经上线,拍照样张、配置、价格一览
华为麒麟980双核NPU谜底揭开:还是来自寒武纪科技
跃昉动态丨江朝晖博士参加「2023年台北未来论坛暨全球数字碳经济发展联盟」启动仪式
为什么大多数厂商不做快充充电宝呢?
DCDC开关电源布局设计---噪声的来源和降低
三相电源的连接方法及原理
电信云的两个发展阶段介绍
弹片微针模组在手机摄像头测试中的应用优势是什么
夜间驾驶的“第三只眼”,车载视觉的行人检测受到广泛关注
一种能让物体“躲避”红外摄像机的轻量柔性薄膜
ADF4350集成电压控制振荡器的性能与应用