(win)C、C++ 处理文件名称
- 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;
}
版权声明: 本文为 InfoQ 作者【DS小龙哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/c7208d728d81ca8c132980565】。文章转载请联系作者。
DS小龙哥
之所以觉得累,是因为说的比做的多。 2022.01.06 加入
熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域
评论