如何从C中的字符串中剥离文件扩展名?
例如,
如果我有文件扩展名的文件名
hello.txt的
你好ç
hello.java
应该只产生没有扩展名的文件名
你好
文件扩展名的长度无关紧要.
该功能也应该是便携式的,而不是系统相关的.
我知道如何使用strchr或获取文件扩展名strrchr.我已经在Bash和Python中完成了这个,但我从来没有在C中这样做过.
注意:这是个人练习,有助于加强我对C编程语言的理解.
我不知道有一种最好的方法,但这是一种方法.大概你不想从点文件中删除名称.此外,您可能只想删除最后一个点到字符串末尾的字符.请注意,在下面的代码中,输入字符串被修改,因此文件名不能是字符串文字,但必须是以空字符结尾的字符数组.
#include <stdio.h>
#include <string.h>
void strip_ext(char *);
int main(void)
{
char filename1[] = "myfile.txt";
char filename2[] = ".emacs";
char filename3[] = "anotherfile.";
char filename4[] = "nodot";
char filename5[] = "";
char filename6[] = "dot.dot.dot";
strip_ext(filename1);
strip_ext(filename2);
strip_ext(filename3);
strip_ext(filename4);
strip_ext(filename5);
strip_ext(filename6);
printf("file1: %s\n", filename1);
printf("file2: %s\n", filename2);
printf("file3: %s\n", filename3);
printf("file4: %s\n", filename4);
printf("file5: %s\n", filename5);
printf("file6: %s\n", filename6);
return 0;
}
void strip_ext(char *fname)
{
char *end = fname + strlen(fname);
while (end > fname && *end != '.') {
--end;
}
if (end > fname) {
*end = '\0';
}
}
Run Code Online (Sandbox Code Playgroud)
节目输出:
file1: myfile
file2: .emacs
file3: anotherfile
file4: nodot
file5:
file6: dot.dot
Run Code Online (Sandbox Code Playgroud)
@David C. Rankin指出,更复杂的文件路径可能会使问题复杂化.下面是对strip_ext()遇到正斜杠或反斜杠时停止查找点的函数的修改,在这种情况下,文件名字符串保持不变:
void strip_ext(char *fname)
{
char *end = fname + strlen(fname);
while (end > fname && *end != '.' && *end != '\\' && *end != '/') {
--end;
}
if ((end > fname && *end == '.') &&
(*(end - 1) != '\\' && *(end - 1) != '/')) {
*end = '\0';
}
}
Run Code Online (Sandbox Code Playgroud)
使用相同的测试字符串和其他测试字符串运行此函数:
char filename7[] = "/my.dir/myfile";
char filename8[] = "/dir/.filename";
Run Code Online (Sandbox Code Playgroud)
生成此输出:
file1: myfile
file2: .emacs
file3: anotherfile
file4: nodot
file5:
file6: dot.dot
file7: /my.dir/myfile
file8: /dir/.filename
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2383 次 |
| 最近记录: |