2016-04-03 4 views
1

Je tente d'écrire une série de fonctions qui prendront un nom de fichier en entrée (par exemple, main.c) et renverront l'extension de fichier en utilisant strsep(). Quand j'exécute le programme, j'obtiens une erreur de bus chaque fois que la fonction strsep est appelée. Voici le code:Erreur de bus à l'aide de 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); 
} 

La fonction principale de ce programme le format appelle simplement() avec un char * contenant un nom de fichier:

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

     return 0; 
} 

Je ne suis pas sûr pourquoi ce programme provoque une erreur de bus lors de l'exécution . Merci d'avance pour toute aide que vous pouvez fournir.

Edit: principal code de fonction ajoutée

+0

'La fonction principale de ce programme appelle simplement format() avec un caractère * contenant un nom de fichier.' ': Nous nous en fichons; nous avons besoin du code. BTW, 'strsep()' est mauvais et dangereux vaudou. Vous devriez utiliser 'strtok()' à la place. – 3442

+0

Si filename est un littéral de chaîne, vous ne pourrez probablement pas y écrire. C'est probablement la cause de l'erreur de bus. – PSkocik

+0

@KemyLand a ajouté le code 'main()' –

Répondre

1

La mémoire de littéraux de chaîne n'est pas garanti inscriptible.

Do

char filename[] = "test.c"; 

pour créer un tableau inscriptible char à la place.

Sur mon système, cette mémoire est protégée en lecture seule et toute tentative de violation de cette protection génère des erreurs de segmentation.

En outre, get_ext peut être simplement:

return strsep(filename, "."); 

et sizeof(char) est définie comme étant une (1 octet qui est - même si cet octet ne sont pas 8 bits de grande taille (rare)).