2016-04-03 66 views
1

我正在嘗試編寫一系列函數,將文件名稱作爲輸入(例如main.c)並使用strsep()返回文件擴展名。當我運行程序時,只要調用strsep函數就會出現總線錯誤。下面是代碼:總線錯誤使用strsep()

static char *get_extn(char **filename) 
{ 
     char *delim = "."; 
     strsep(filename, delim); 

     return *filename; 
} 

void format(char *filename) 
{ 
     char *extn = malloc(256 * sizeof(char)); 

     strncpy(extn, get_extn(&filename), 256); 
     printf("extn: %s\n", extn); 
} 

該方案的主要功能簡單地調用格式()與包含文件名的一個char *:

int main(int argc, char *argv[]) 
{ 
     char *filename = "test.c"; 
     format(filename); 

     return 0; 
} 

我不確定爲什麼在執行時該程序使總線錯誤。提前感謝您提供的任何幫助。

編輯:加入主要功能碼

+0

'這個程序的主要功能只是用一個包含文件名的char *調用format()。':我們不關心;我們需要代碼。順便說一下,'strsep()'是壞的和危險的巫術。你應該使用'strtok()'來代替。 – 3442

+0

如果filename是一個字符串文字,那麼你可能無法寫入它。這可能是總線錯誤的原因。 – PSkocik

+0

@KemyLand添加'main()'代碼 –

回答

1

字符串文字的存儲器不保證可寫。

char filename[] = "test.c"; 

,而不是創建一個可寫的字符數組。

在我的系統上,此內存被保護爲只讀,並且嘗試違反此保護措施會生成段錯誤。

此外,get_ext可以簡單地是:

return strsep(filename, "."); 

sizeof(char)和被定義爲1(1個字節即 - 即使該字節不是8位大(罕見))。