2010-07-20 8 views

Respuesta

9

Hay basename().

Aliméntelo con una ruta (en forma de char*) y le devolverá el nombre base (que es el nombre del archivo/directorio que desea) en la forma de otro char*.

EDIT:

me olvidó decir que la versión POSIX de basename() modifica su argumento. Si se quiere evitar esto, puedes usar la versión GNU de basename() anteponiendo esto en su fuente:

#define _GNU_SOURCE 
#include <string.h> 

A cambio de esta versión de basename() devolverá una cadena vacía si le da de comer con, por ejemplo, /usr/bin/ debido a la barra al final.

+2

strdup-ing la ruta de acceso antes de alimentarlo a basename() en su lugar. – 341008

+0

sí, buen punto –

3

¿Quieres nombre base(), que debe estar presente en casi cualquier sistema POSIX-ish:

http://www.opengroup.org/onlinepubs/000095399/functions/basename.html

#include <stdio.h> 
#include <libgen.h> 

int main() { 
    char name[] = "/foo/bar.txt"; 
    printf("%s\n", basename(name)); 
    return 0; 
} 

...

$ gcc test.c 
$ ./a.out 
bar.txt 
$ 
+3

nombre base es destructivo y provocará una segfault en este caso, intente 'basename ("/foo/bar/")'. – falstro

+0

@roe: En realidad, es posible que se haya producido una falla de seguridad en _este caso. En mi caso, estuvo bien. :) Pero tienes razón, arreglado. –

+0

sí, naturalmente, lo siento. Quise decir que PODRÍA segfault en su caso, suponiendo que el literal de la cadena es algo macro en tiempo de compilación o algo así. El punto es que podría ser destructivo, y estás obligado a hacer una copia de tu cadena. – falstro

6
#include <string.h> 

char *basename(char const *path) 
{ 
    char *s = strrchr(path, '/'); 
    if (!s) 
     return strdup(path); 
    else: 
     return strdup(s + 1); 
} 
+1

No se olvide de liberar el búfer recién asignado: "man strdup" dice: "La memoria para la nueva cadena se obtiene con malloc (3), y se puede liberar con free (3)". Eliminar ":" después de "else". – user2431763

0

pienso el código C correcto de @ matt-joiner debe ser:

 
char *basename(char const *path) 
{ 
     char *s = strrchr(path, '/'); 
     if(s==NULL) { 
       return strdup(path); 
     } else { 
       return strdup(s + 1); 
     } 
} 
+0

'! S' es el código C idiomático, en comparación con' s == NULL' que es superfluo. – syockit

Cuestiones relacionadas