写点什么

(win)C、C++ 处理文件名称

作者:DS小龙哥
  • 2022 年 5 月 19 日
  • 本文字数:4892 字

    阅读完需:约 16 分钟

一. 前言

**环境:**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 <<"获取不带路径的文件名:"<<filename << endl;

//2.获取不带后缀的文件名 string name = filename.substr(0, filename.rfind(".")); cout <<"获取不带后缀的文件名:"<<name << endl;
//3.获取后缀名 string suffix_str = filename.substr(filename.find_last_of('.') + 1); cout << "获取后缀名:"<<suffix_str << endl;
//4. 获取基本名称 cout << "基本名称:"<<filename.substr(0, filename.find("."));
复制代码


返回结果:


获取不带路径的文件名:data.22.txt获取不带后缀的文件名:data.22获取后缀名:txt基本名称:data
复制代码

三. C 语言字符串处理

1. 计算空格、大小写字母

从键盘上输入一个字符串, 计算字符串里有多少个空格、小写字母、大写字母、数字。


#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件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<len;i++)  {    if(str[i]==' ')cnt[0]++;    else if(str[i]>='a'&&str[i]<='z')cnt[1]++;    else if(str[i]>='A'&&str[i]<='Z')cnt[2]++;    else if(str[i]>='0'&&str[i]<='9')cnt[3]++;    else cnt[4]++;  }    /*3. 打印结果*/  printf("空格:%d\n",cnt[0]);  printf("小写:%d\n",cnt[1]);  printf("大写:%d\n",cnt[2]);  printf("数字:%d\n",cnt[3]);  printf("其他:%d\n",cnt[4]);  return 0;}
复制代码

2. 字符串排序

示例:#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件
int main(int argc,char **argv){ int len=0; int i,j; char tmp; char str[100]; fgets(str,100,stdin); //从键盘上录入字符串 (标准输入) /*1. 计算字符串的长度*/ len=strlen(str); //计算字符串长度 /*2. 字符串排序*/ for(i=0;i<len-1;i++) { for(j=0;j<len-1-i;j++) { if(str[j]<str[j+1]) { tmp=str[j]; str[j]=str[j+1]; str[j+1]=tmp; } } } /*3. 打印结果*/ printf("%s\n",str); //打印字符串(标准输出) puts(str); //打印字符串(标准输出) fputs(str,stdout); //打印字符串(标准输出) return 0;}
复制代码

3. 字符串插入

字符串插入: “1234567890”在第 2 个位置后面插入”ABC”最终结果: “12ABC34567890”


#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件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<new_len;i++)src_str[addr+i]=new_str[i];    /*4. 打印字符串*/  src_str[src_len+new_len]='\0'; //在字符串结尾添加'\0'  printf("src_str=%s\n",src_str);  return 0;}
复制代码

4. 字符串查找

字符串查找: “123456123abc123hbc”查找字符串”123”的数量。数量是 3


#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件
int main(int argc,char **argv){ char src_str[100]; char find_str[10]; int src_len=0,find_len=0; int i,j; int cnt=0; /*1. 录入字符串*/ printf("输入源字符串:"); //123dufvdfv123dfljvb fgets(src_str,100,stdin); //从键盘上录入源字符串 //scanf("%s",src_str); printf("输入查找的字符串:"); //123 fgets(find_str,10,stdin); //从键盘上录入源字符串 //scanf("%s",find_str); /*2. 计算长度*/ src_len=strlen(src_str); src_str[src_len-1]='\0'; src_len-=1; //src_len=src_len-1; find_len=strlen(find_str); //"123\n" =4 find_str[find_len-1]='\0'; find_len-=1; printf("源字符串:%s,%d\n",src_str,src_len); printf("查找的字符串:%s,%d\n",find_str,find_len); /*3. 查找字符串*/ for(i=0;i<src_len-find_len+1;i++) { for(j=0;j<find_len;j++) { //只有一次不相等就退出 //123kdfvfd 123 if(src_str[i+j]!=find_str[j])break; } if(j==find_len) //条件成立表示查找成功 { cnt++; i+=find_len-1;//向后移动 } } /*4. 打印查找结果*/ printf("cnt=%d\n",cnt); return 0;}
复制代码

5. 字符串删除

字符串删除: “1234567890”删除”456” 最终结果: “1237890”


示例:#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件
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<src_len-del_len+1;i++) { for(j=0;j<del_len;j++) { if(src_str[i+j]!=del_str[j])break; } if(j==del_len) { cnt++; /*4.删除*/ for(j=i;j<src_len-del_len;j++) { src_str[j]=src_str[j+del_len]; } src_len-=del_len; i-=1; //继续在当前位置查找 } } src_str[src_len]='\0'; printf("src_str=%s\n",src_str); printf("cnt=%d\n",cnt); return 0;}
复制代码

6. 字符串替换

字符串”1234567890”将456替换为”888” 最终: “1238887890”需要考虑3种情况
复制代码

7. 字符串转整数。

从键盘上输入一个字符串”12345”, 得到整数: 12345;


#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件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;}
复制代码

8. 整数转字符串

整数转字符串。输入一个整数 1234,得到字符串: "1234"


1234%10=4  1234/10=123 123%10=3 123/10=12示例:#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件void int_to_string(char str[],int data);
int main(int argc,char **argv){ char str[100]; int_to_string(str,12345); printf("str=%s\n",str); return 0;}
/*函数功能: 整数转为字符串函数参数: char str[] //存放转换之后的整数(字符串) int data //待转换的整数*/void int_to_string(char str[],int data){ int i=0,j; char tmp; /*1. 将整数转为字符串*/ while(data) { str[i]=data%10+'0'; data/=10; i++; } str[i]='\0'; /*2. 交换顺序*/ for(j=0;j<i/2;j++) { tmp=str[j]; str[j]=str[i-j-1]; str[i-j-1]=tmp; }}
复制代码

9. 浮点数转字符串

浮点数转字符串。输入一个浮点数 123.456 得到字符串"123.456"


示例:#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件void float_to_string(char str[],float data);
int main(int argc,char **argv){ char str[100]; float_to_string(str,12345.123); printf("str=%s\n",str); return 0;}
/*函数功能: 浮点数转为字符串函数参数: char str[] //存放转换之后的 浮点数(字符串) int data //待转换的 浮点数*/void float_to_string(char str[],float data){ int i=0,j; char tmp; int addr; int int_data=data; //得到整数 12345 int float_data=(data-int_data)*1000000;// 0.123456 *1000000 =123456
/*1. 将整数部分转为字符串*/ while(int_data) { str[i]=int_data%10+'0'; int_data/=10; i++; } str[i]='.'; //添加小数点 /*2. 交换顺序: 整数*/ for(j=0;j<i/2;j++) { tmp=str[j]; str[j]=str[i-j-1]; str[i-j-1]=tmp; } /*3. 将浮点数部分转为字符串*/ i++; //跨过小数点 addr=i; while(float_data) { str[i]=float_data%10+'0'; float_data/=10; i++; } str[i]='\0'; /*4. 交换顺序: 小数部分*/ for(j=0;j<3;j++) { tmp=str[addr+j]; str[addr+j]=str[i-j-1]; str[i-j-1]=tmp; }}
复制代码

10.字符串转浮点数

字符串转浮点数。输入一个字符串: "123.456" 得到浮点数类型: 123.456


#include <stdio.h>  //标准输入输出#include <string.h> //字符串处理头文件float string_to_float(char str[]);int main(int argc,char **argv){  float data;  char str[]="123.456";  data=string_to_float(str);  printf("data=%f\n",data);  return 0;}
/*函数功能: 字符串转为浮点数字符转为整数: -48 或者 -'0'*/float string_to_float(char str[]){ int int_value=0; //存放转换之后的结果 int float_value=0; int i=0; float data; int cnt=0; //记录小数部分的数量 int tmp=1; /*1. 整数部分*/ while((str[i]!='\0')&&(str[i]>='0'&&str[i]<='9')) { int_value*=10; int_value+=str[i]-'0'; i++; } /*2. 浮点数部分*/ i++; //跨过小数点 while((str[i]!='\0')&&(str[i]>='0'&&str[i]<='9')) { float_value*=10; float_value+=str[i]-'0'; i++; cnt++; } for(i=0;i<cnt;i++)tmp*=10; data=int_value; //整数部分 data+=float_value/(tmp*1.0); return data;}
复制代码


发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
(win)C、C++处理文件名称_5月月更_DS小龙哥_InfoQ写作社区