2013-09-01 108 views
2
的延伸

我的函數傳遞類型更改傳遞文件名

char *myFilename; 

我想改變現有的擴展「的.sav」,或者如果沒有擴展,只需添加」的文件名。 sav「到文件末尾。但我需要考慮名爲「myfile.ver1.dat」的文件。

任何人都可以給我一個想法,以實現這一目標的最佳途徑。

我正在考慮使用函數來查找最後一個「。」並刪除後面的所有字符,並將其替換爲「sav」。或者如果沒有「。」被發現,簡單地在字符串的末尾添加「.sav」。但不知道該怎麼做,因爲我對字符串的'\ 0'部分感到困惑,以及strlen是否以'\ 0'返回整個字符串,還是我需要+1以後的字符串長度。

我想最終以文件名傳遞給fopen()

回答

1

可能是這樣的:

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

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

然後以傳統的方式,刪除和重命名

+0

非常感謝。我將它標記爲答案,因爲它完美地完成了這項工作,並且它還能夠處理文件路徑爲「/folder.1/myfile.data」的情況。我甚至沒有考慮過會導致一個問題,但肯定會。 – Scott

0

strlen的返回的字符數串中,但陣列從0索引,以便

文件名[strlen的(文件名)]

是終止空。

int p;

爲(p值= strlen的(文件名) - 1;(P > 0)& &(文件名[P] =); P--! '')

將循環到零,如果沒有延伸部和否則停在正確的位置。

+0

歡呼聲清理有關strlen如何工作,現在更有意義。 – Scott

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個字符的擴展名。