2016-04-03 9 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); 
} 

このプログラムの主な機能は、単に()ファイル名を含む文字の*でフォーマットを呼び出します:ここでは、コードです

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配列を作成するために

char filename[] = "test.c"; 

を行います。

私のシステムでは、このメモリは読み取り専用として保護されており、この保護に違反しようとするとsegfaultsが生成されます。

また、get_extは単純であることができる:

return strsep(filename, "."); 

sizeof(char)は1(1バイト - そのバイト)が稀(大8ビットでない場合でも)であると定義されます。

関連する問題