嵌入式开发_C语言处理文件目录后缀

举报
DS小龙哥 发表于 2024/02/28 13:21:26 2024/02/28
【摘要】 在 C 语言中,对文件名、目录名、文件后缀等数据进行处理通常需要使用字符串处理函数和技巧。常用的字符串处理包括字符串拷贝、字符串连接、字符串比较、分割字符串以及获取文件后缀等操作。

一. 前言

在 C 语言中,对文件名、目录名、文件后缀等数据进行处理通常需要使用字符串处理函数和技巧。常用的字符串处理包括字符串拷贝、字符串连接、字符串比较、分割字符串以及获取文件后缀等操作。

(1)字符串拷贝:使用 strcpy 函数可以将一个字符串复制到另一个字符串中。

(2)字符串连接:使用 strcat 函数可以将两个字符串连接起来。

(3)字符串比较:使用 strcmp 函数可以比较两个字符串是否相等。

(4)分割字符串:可以使用 strtok 函数将字符串按照指定分隔符分割成多个子字符串。

(5)获取文件后缀:通过查找字符串中最后一个.字符的位置,可以获取文件的后缀名。

这些字符串处理函数和技巧能够帮助我们在 C 语言中对文件名、目录名、文件后缀等数据进行灵活处理。


下面是C语言的代码:

(1)字符串拷贝:使用 strcpy 函数可以将一个字符串复制到另一个字符串中。

char str1[100] = "Hello";
char str2[100];
strcpy(str2, str1); // 将 str1 复制到 str2

(2)字符串连接:使用 strcat 函数可以将两个字符串连接起来。

char str1[100] = "Hello";
char str2[100] = "World";
strcat(str1, str2); // 将 str2 连接到 str1 的末尾

(3)字符串比较:使用 strcmp 函数可以比较两个字符串是否相等。

char str1[100] = "Hello";
char str2[100] = "Hello";
if (strcmp(str1, str2) == 0)
{
    // 字符串相等
}

(4)分割字符串:可以使用 strtok 函数将字符串按照指定分隔符分割成多个子字符串。

char str[100] = "file.txt";
char *token = strtok(str, ".");
while (token != NULL)
{
    printf("%s\n", token);
    token = strtok(NULL, ".");
}

(5)获取文件后缀:通过查找字符串中最后一个.字符的位置,可以获取文件的后缀名。

char filename[100] = "example.txt";
char *dot = strrchr(filename, '.');
if (dot != NULL)
{
    printf("File extension: %s\n", dot + 1);
}


二. 实现代码-纯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;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。