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

时间:2013-09-01 19:18:09

标签: c string filenames file-extension strlen

我的函数传递了

类型的文件名
char *myFilename;

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

任何人都可以给我一个关于实现这一目标的最佳方法的想法。

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

我希望最终以文件名传递给fopen()

3 个答案:

答案 0 :(得分:1)

可能是这样的:

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

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

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

答案 1 :(得分:1)

这里有些懒惰我已经掀起了它,它最少使用标准库函数(也许你想要的东西呢?):

#include <stdio.h>
#include <string.h>


void change_type(char* input, char* new_extension, int size)
{
    char* output = input; // save pointer to input in case we need to append a dot and add at the end of input
    while(*(++input) != '\0') // move pointer to final position
        ;

    while(*(--input) != '.' && --size > 0) // start going backwards until we encounter a dot or we go back to the start
        ;
    // if we've encountered a dot, let's replace the extension, otherwise let's append it to the original string
    size == 0 ? strncat(output, new_extension, 4 ) : strncpy(input, new_extension, 4);
}

int main()
{
    char input[10] = "file";

    change_type(input, ".bff", sizeof(input));

    printf("%s\n", input);

    return 0;
}

它确实打印file.bff。请注意,这可以处理最多3个字符的扩展名。

答案 2 :(得分:0)

strlen返回字符串中的字符数,但数组从0索引,所以

filename [strlen(filename)]

是终止空值。

int p;

for(p = strlen(filename) - 1;(p&gt; 0)&amp;&amp;(filename [p]!='。'); p - )

如果没有延伸,

将循环为零,否则停在正确的位置。