2010-09-30 79 views
1

我想寫一個GET文件擴展名功能C.我需要一個getFileExt幫助(c)中

這是我...

char *getFileExt(char *filename) { 

    char ext[10]; 

    while (*filename) { 
     filename++; 
    } 

    while (*filename != '.') { 
     *(ext++) = *(--filename);    
    } 
    strrev(*ext);  
    return ext;  
} 

我一直在while循環內的線上獲得EXC_BAD_ACCESS。我是新的指針,所以我的猜測是我做錯了他們。

爲什麼我不能將filename指針的值分配給ext

感謝

+1

'ext'是** ** NOT的指針。 – pmg 2010-09-30 13:59:39

+1

只是一個旁註:你不能像這樣返回分機。你的char ext [10]'將它分配到堆棧上,當你的函數結束時它會消失。 – Habbie 2010-09-30 14:01:31

回答

5

你不應該返回本地數組的指針。當函數失去範圍並且指針懸空時,數組數據將丟失。

此外,您不能更改數組指針的值。這就是你得到EXC_BAD_ACCESS錯誤的原因。您可以使用整數索引或指向第一個條目的指針char *

順便說一句:有一個功能strrchr(見here),它給你一個字符串中最後一個字符的出現。您可以可以返回結果指針,因爲它指向文件名數組中的有效位置,該位置在函數外也是有效的。

2
char* getFileExt(char *filename) 
{ 
    while (*filename) filename++; 
    while (*filename != '.') --filename;     
    return filename;  
} 

或版本與非崩潰,如果沒有文件名包含.

char* getFileExt(char *filename) 
{ 
    char* _ext = filename; 
    while (*_ext) _ext++; 
    while (_ext >= filename && *_ext != '.') --_ext;     
    if (_ext < filename) _ext = NULL; 
    return ext;  
} 
+0

第一個例子是否返回指向文件擴展名開頭的指針? – alex 2010-09-30 14:47:21

+0

'_ext bk1e 2010-09-30 15:10:01

+0

@ bk1e:不,你沒有權限,在這個鏈接中描述了其他情況 – Svisstack 2010-09-30 15:35:38

2

我一直在while循環中的 行上得到EXC_BAD_ACCESS。

while (*filename != '.') 
{ 
    *(ext++) = *(--filename);    
} 

以上您正在治療「分機」作爲指針,然而「EXT」被聲明爲陣列 如果你想使用一個指針,則聲明另一個指針,它指向「分機」

while (*filename) { 
    filename++; 
} 
在上述

while循環您移動鼠標指針「文件名」,直到它的土地上「\ 0」 沒關係,而是你可以從文件名末尾自己的最後一個位置開始「」像這樣:

char *p = filename + strlen(filename) - 1; // last char 

再往前走

while (*p != '.') --p; 

現在你p是在 ''是

現在,從p複製+ 1

strcpy(ext, p + 1); 

當你回來時,因爲它沒有函數體之外的存在,所以無法返回「轉」。

一個辦法做到這一點是要麼通過分機作爲一個額外的參數,你分配「分機」的功能之外或使用堆爲擴展分配空間

char *getFileExt(char *filename,char *ext) 

甚至更​​好的功能

char *getFileExt(char *filename,char *ext, size_t maxlen_ext) 

char *getFileExt(char *filename) 
{ 
    char* ext = malloc(10); 
...