我的函数传递了
类型的文件名char *myFilename;
我想将现有扩展名更改为“.sav”,或者如果没有扩展名,只需将“.sav”添加到文件末尾即可。但我需要考虑名为“myfile.ver1.dat”的文件。
任何人都可以给我一个关于实现这一目标的最佳方法的想法。
我正在考虑使用函数来查找最后一个“。”并删除它后面的所有字符,并用“sav”替换它们。或者如果没有“。”找到了,简单地将“.sav”添加到字符串的末尾。但是不知道怎么做,因为我对字符串的'\ 0'部分感到困惑,strlen是否用'\ 0'返回整个字符串,或者我需要+1之后的字符串长度。
我希望最终以文件名传递给fopen()
。
答案 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 - )
如果没有延伸,将循环为零,否则停在正确的位置。