2

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

char *myFilename;

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

谁能给我一个关于实现这一目标的最佳方法的想法。

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

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

4

3 回答 3

1

可能是这样的:

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

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

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

于 2013-09-01T19:34:54.393 回答
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 个字符的扩展。

于 2013-09-01T19:38:21.510 回答
0

strlen 返回字符串中的字符数,但数组从 0 开始索引,因此

文件名 [strlen(文件名)]

是终止的空值。

诠释 p;

for (p = strlen (filename) - 1; (p > 0) && (filename[p] != '.'); p--)

如果没有扩展,将循环为零,否则在正确的位置停止。

于 2013-09-01T19:29:41.360 回答