Extraer el nombre de un archivo sin su extensión

Resuelto
Hola, ¿hay una función que extraiga el nombre de un archivo en lenguaje C, por favor?
ejemplo

nombre: operación.txt

nombre sin la extensión: operación

15 respuestas

  1. No sé cuál función elegir, hay realmente muchas y hay muchas que no conozco
    ¿Puede decirme cuál es, por favor?
    1. Si alguien sabe cómo hacerlo, estoy interesado
      Por ejemplo, memccpy puede hacer más o menos lo que quiero, excepto que incluirá el . o yo no quiero el punto.
      1. En realidad, al observar este código:

         #include <stdio.h> #include <string.h> #include <stdlib.h> char* msg = "This is the string: not copied"; int main( void ) { char buffer[80]; memset( buffer, '\0', 80 ); memccpy( buffer, msg, ':', 80 ); printf( "%s\n", buffer ); return EXIT_SUCCESS; } 


        Devuelve this is the string:

        No sé en este código es como si se pusiera un ‘\0’ al final de buffer, si no, no veo la utilidad de hacer memset(…).
        1. Colaborador
          ¿Qué entiendes por "fin" de buffer?
          ¿Conoces las convenciones en C para representar cadenas de caracteres?
      2. Ah ok, veo que comprendo mejor

        Entonces, por ejemplo, si tengo
        char archivo [10]= " operaciones.txt "
        archivo_sin_extension=operaciones
        Char archivo_sin_extension[10];

        Para ello hago memccpy(archivo_sin_extension, archivo, '.' ,10)
        puts(archivo_sin_extension)
        Normalmente me da operaciones.

        ¿Cómo hago para no tener en cuenta el .?
        1. Colaborador
          Tal vez pruebes si el último carácter es un "".”, y si es así, reemplazarlo por \0.

          ¿En qué contexto haces esto?
      3. Gracias, he entendido. Gracias por tu ayuda.

        De hecho, tengo que hacer un programa; debo reemplazar los .txt por .as.
        1. En realidad, escribí este código, pero no funciona y no entiendo por qué
           #include <stdio.h> #include <string.h> int main(){ char archivo[]="operations.txt"; char dest[50]; char archivo_sin_extension[50]; int i=0; while(archivo[i]!='\0'){ if(archivo[i]=='.'){ memccpy(archivo_sin_extension,archivo,archivo[i-1],strlen(archivo)); puts(archivo_sin_extension); } i++; } } 


          ¿Sabes qué está mal en mi código?

          yo
          1. Colaborador
            ""no funciona": ¿qué está pasando?

            tu uso de memccpy me parece particularmente arriesgado."
        2. En realidad, a veces me muestra
          operations��U
          operations6�wU
          operationsX�
          .....

          Es raro que me muestre cosas así

          En realidad quería que memccpy me devolviera operations

          o p ....s .
          0 1 9 10

          si utilizo memccpy como antes, devuelve operations/

          Yo quería encontrar con mi programa el índice donde está el punto, es decir, i=9

          y al hacer archivo[i-1] me permite detenerme en s

          Y haciendo como antes, excepto que reemplazo '.' por archivo[i-1]
          1. Colaborador
            ¿Y si hay dos s en el nombre?
          2. Colaborador
            ¿Has leído la documentación de memccpy?

            ¿No has visto recientemente lo que algunos hacían antes de memccpy?
          3. @yg_beAh, no había visto esta respuesta, ¿antes qué querías decir?
        3. Normalmente no debería cambiar nada ya que memccpy se detendrá en el carácter que está antes del .