[ Foro de C++ ]

Problema de cadenas de caracteres

21-May-2009 09:58
Jose Angel Escudero Moreno
2 Respuestas

Hola ante todo presentarme, me llamo Jose Angel y me gustaría hacer una consulta. Cuento con detalle lo que quiero hacer: Se trata de crear un programa en C++ que pasandole por parámetros una ruta relativa o absoluta, este sea capaz de dividir el fichero de la ruta, mas tarde utilizaré esto para un programa de ofuscación de archivos js que tengo a medio acabar... Bien, a continuación dejo el código adjunto y cuento cual es la idea... utilizo un primer for para ver el tamaño del nombre del fichero, esto lo consigo leyendo hasta la primera '\', bien una vez teniendo el tamaño del fichero recorro la cadena que contiene argv[1] pasada con strcpy de forma inversa y voy rellenando el nombre del fichero, ahora resto tamaños y obtengo el tamaño restante de la cadena, con esto hago un while y asigno a ruta. Si al programa le pasamos por argumento C:\ies\script.js este nos debería pintar por pantalla: Ruta: C:\ies\ Fichero: script.js Pero esta fallando el programa y lo que devuelve es: C:\ies\"caracteres ASCII", si podéis ayudarme lo agradecería ya que estoy aquí intentando arreglarlo, pero no lo veo. Gracias anticipadas y un saludo. Jose Angel
23-May-2009 23:22
Nacho Cabanes (+84)

Bienvenido, José Angel!  :-)

A ver, te voy comentando lo que vea...

- En primer lugar, casi todo el fuente es C (salvo por el cin y cout), toda la lógica de manipulación de cadenas que estás usando es de C, así que podías haber hecho al pregunta en el foro de C, que está más frecuentado, así que quizá alguien te hubiera contestado antes que yo, que ando un poco liado...

- En segundo lugar, usas alguna construcción poco estándar, como eso de "char varapo[tam]", que hace que no compile en Borland C++ 5.5: siendo puristas, entre los corchetes debe aparecer una constante, no una variable; si quieres usar una variable debería ser reservando memoria dinámicamente (con "malloc" o "new", por ejemplo). La solución más sencilla, ya que el programa es de pequeño tamaño, es redimensionar, dejando espacio de sobra para todas las variables:

char varapo[MAX_SIZE];

- En tercer lugar, el fuente es relativamente poco legible: los puristas recomiendan que todas las variables de declaren al principio de la función, no mezcladas con el código, y que los nombres sean autoexplicativos (¿qué quiere decir "varapo"? ¿qué diferencia hay entre "contador" y "contador2"? ).

- Si corrijo el apartado 2, compila correctamente con BCC55 y funciona bien con el ejemplo que propones "C:\ies\script.js". La lógica de cómo lo resuelves es buena, pero lo haces un poco engorroso: yo recorrería de atrás a adelante pero no para copiar de una cadena a otra, sino sólo para localizar dónde está la última barra, y entonces hacer dos "strcpy", uno que copie a partir de la barra (nombre de fichero) y otro antes de la barra (ruta).

- Para terminar, no es un programa robusto  :-p  Antes de mirar el valor de "argv[1]" deberías siempre comprobar "argc" para asegurarte de que hay parámetros. Y no pongas "includes" que no necesitas, como el de "time", el de "windows", el de "dirent", etc.

Te copio aquí un fragmento del fuente, pero se verá descolocado, así que te lo adjunto también.

   longitud=strlen(rutaCompleta);

   // Busco última barra (o principio de cadena si no la hay)
   for(i=longitud; (i>=0) && (rutaCompleta[i]!='\\'); i--)
       ;
   posicionBarra = i+1;
   
   strcpy(nombreFichero, rutaCompleta +posicionBarra);

   memset(carpeta, 0, MAX_SIZE);
   strncpy(carpeta, rutaCompleta,posicionBarra);


25-May-2009 08:31
Jose Angel Escudero Moreno

Hola de nuevo Nacho, muchas gracias por tu respuesta, la verdad es que me ha gustado más la forma de encontrar las barras que me has propuesto, lo implementaré ahora mismo. Por lo de los nombres de variables varapo significa variable de apoyo, contador2 es la auxiliar de contador, y por lo del programa robusto lo que pasa es que solo te he pasado la parte de encontrar las barras ya que el programa principal es un poquitin más grandes, creo que eran cerca de 800 líneas. En cuanto lo termine te lo paso para que veas el funcionamiento. Muchas gracias y felicidades por esta comunidad de programadores, a mi parecer indispensable si alguien quiere iniciarse en este mundillo. Un saludo y nos vemos por la graduación.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)