更改传递的文件名的扩展名

标签 c string filenames file-extension strlen

我的函数传递了类型的文件名

char *myFilename;

我想将现有扩展名更改为“.sav”,或者如果没有扩展名,只需将“.sav”添加到文件末尾即可。但我需要考虑名为“myfile.ver1.dat”的文件。

任何人都可以告诉我实现这一目标的最佳方法吗?

我正在考虑使用一个函数来查找最后一个“。”并删除其后面的所有字符并将其替换为“sav”。或者如果没有“.”找到后,只需将“.sav”添加到字符串末尾即可。但不知道该怎么做,因为我对字符串的 '\0' 部分感到困惑,以及 strlen 是否返回带有 '\0' 的整个字符串,或者我是否需要对后面的字符串长度 +1。

我希望最终得到一个文件名来传递给 fopen()

最佳答案

可能是这样的:

char *ptrFile = strrchr(myFilename, '/');
ptrFile = (ptrFile) ? myFilename : ptrFile+1;

char *ptrExt = strrchr(ptrFile, '.');
if (ptrExt != NULL)
    strcpy(ptrExt, ".sav");
else
    strcat(ptrFile, ".sav");

然后是传统方式,删除并重命名

关于更改传递的文件名的扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18562000/

相关文章:

c++ - 如何在 C++ 中获取当前运行的可执行文件的文件名

c - 当我插入打印语句时变量值发生改变?

c++ - c/c++关于指针的问题(双指针)

string - 如何在 PostScript 中获取字符串的高度度量?

java - 如何在 Java 中比较字符串?

swift - 从文本文件读取和写入字符串

php - 删除图像扩展名,重命名并还原

java - getNameCount() 实际上算什么?

c - 为什么有两种写常量指针的方法,但只有一种写常量指针的方法?

c - 在没有 uint8_t 数据类型的 MCU 上使用 uint8_t 的结构