elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Tratando de crear array de strings
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [C] Tratando de crear array de strings  (Leído 4,091 veces)
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
[C] Tratando de crear array de strings
« en: 8 Junio 2019, 20:54 pm »

Buenas, he estado tratando de crear un array de strings, para luego leer todas sus strings.
Código
  1. /* Reservamos 16 elementos de string */
  2. char* file_names_in_dir[16];
  3. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  4.        ...
  5. if (drce[i].file_name[0] == 0x00)
  6. break;
  7. file_names_in_dir[i] = drce[i].file_name;
  8. ++files_in_directory;
  9. }
  10. ...
  11. printf("%s", file_names_in_dir[0]);
  12. ...
  13.  
El tema es que funciona, pero luego de imprimir la string correctamente le sigue basura.
por ejemplo, file_names_in_dir[0] es "HELLO TXT", pero luego la string sigue, pero con basura.
Alguna idea? Gracias.


En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: [C] Tratando de crear array de strings
« Respuesta #1 en: 8 Junio 2019, 21:16 pm »

Puedes publicar todo el código?
Estás usando variables como ++files_in_directory;
Qué no sé exactamente lo que hace.

Qué es la basura? Direcciones de memoria? Espacios? El caracter null terminator \o?


En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: [C] Tratando de crear array de strings
« Respuesta #2 en: 8 Junio 2019, 21:33 pm »

Ten en cuenta que no estás copiando los datos de <drce[indice].file_name> en <file_names_in_dir[indice]>... Lo que estás haciendo es que el puntero del array de punteros que has creado apunte al mismo lugar que el otro <char*>. Entonces si se modifica el valor de <drce[indice].file_name> antes de mostrar tu array, éste último mostrará el nuevo contenido que puede no ser lo que tú esperabas.

Y como bien dice @string Manolo, con ese trocillo de código no podemos ayudar mucho más.
Recordarte también que para que la cadena termine necesitas el caracter '\0' que igual no aparece y por eso la cadena no termina donde debería.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: [C] Tratando de crear array de strings
« Respuesta #3 en: 8 Junio 2019, 21:40 pm »

Puedes publicar todo el código?
Estás usando variables como ++files_in_directory;
Qué no sé exactamente lo que hace.

Qué es la basura? Direcciones de memoria? Espacios? El caracter null terminator \o?

El files_in_directory no esta relacionado. Creo que la basura es un salto extraño de memoria, ya que de ahi me imprime una string que no tiene nada que ver. Ese string basura no se relaciona de ninguna manera con el array de string que trato de imprimir.
Ah y el código completo (comentarios en ingles, pero los traduzco):
Código
  1. #include <stdio.h>
  2. #include "hd.h" /* No relacionado con la falla */
  3. char* file_names_in_dir[16];
  4. void read_directory(void)
  5. {
  6. /* lee el directorio */
  7. hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
  8.  
  9. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  10. if (drce[i].file_name[0] == 0x00) {
  11. printf("\n-- END --\n");
  12. break;
  13. }
  14. /* el archivo tiene un nombre largo */
  15. if ((drce[i].attributes & 0x0F) == 0x0F)
  16. continue;
  17.  
  18. /* el seudoarchivo es en realidad un directorio */
  19. if ((drce[i].attributes & 0x10) == 0x10){
  20. printf("Directory name: %s\n", drce[i].file_name);
  21. continue;
  22. }
  23.  
  24. /* el archivo no existe */
  25. if (drce[i].file_name[0] == FAT32_DELETED_FILE)
  26. continue;
  27. printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
  28. file_names_in_dir[i] = drce[i].file_name;
  29. ++files_in_directory;
  30. }
  31. }
  32.  
  33. void read_bpb(uint32_t offset)
  34. {
  35. /* Read the BPB (BIOS parameter block) - Lee el BPB (Bloque de parámetros de la BIOS) */
  36. hd_read(offset, FATBPB_SIZE, (uint8_t*)&bpb);
  37.  
  38. fat_start = (offset + bpb.reserved_sectors);
  39. fat_size = bpb.sectors_per_fat;
  40. start_of_data = fat_start + (fat_size * bpb.fats_number);
  41. start_of_root = start_of_data + ((bpb.cluster_root - 2) * bpb.sectors_per_cluster);
  42. root_dir_sects = ((bpb.root_dir_entries * 32) + (bpb.bytes_per_sector - 1) / bpb.bytes_per_sector);
  43. data_sects = (bpb.reserved_sectors + bpb.fats_number * (bpb.sectors_per_fat + root_dir_sects));
  44. cluster_count = data_sects / bpb.sectors_per_cluster;
  45.  
  46. read_directory();
  47. printf("%s", file_names_in_dir[0]);
  48. }
  49.  
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: [C] Tratando de crear array de strings
« Respuesta #4 en: 8 Junio 2019, 22:06 pm »

Diría que el error son los <continue>...
Piensa en una iteración <i = 0> y se cumple una condición y por tanto un <continue>. Ahora <i = 1> pero no se han ejecutado las líneas siguientes al <continue> en esa iteración por lo que no se ha ejecutado la línea 28.
Ahora no se ejecuta ningún <continue> (recordemos i = 1). Estás guardando <drce[1].file_name> pero lo estás guardando en <files_names_in_dir[1]>... Qué hay en <files_names_in_dir[0]>??? Basura.

Tienes que usar una variable auxiliar que sólo se incremente si se ejecuta la línea 28 para guardar siempre en posiciones consecutivas.

Por algo no se recomiendan usar ese tipo de sentencias <continue>, <break>, etc. Yo cambiaría eso e implementaría el mismo comportamiento con un <bool> o <int> si no quieres usar <bool>, pero vamos, evitando sentencias de salto.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: [C] Tratando de crear array de strings
« Respuesta #5 en: 8 Junio 2019, 22:37 pm »

He tratado esto, pero sigue igual, imprime 16 veces la string correctamente y otras 16 basura.
Código
  1. int aaa = 0;
  2. void read_directory(void)
  3. {
  4. /* Read the directory */
  5. hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
  6.  
  7. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  8. if (drce[i].file_name[0] == 0x00) {
  9. kputs("\n-- END --\n");
  10. break;
  11. }
  12. /* File has a long file name */
  13. if ((drce[i].attributes & 0x0F) == 0x0F)
  14. continue;
  15.  
  16. /* "File" is a directory */
  17. if ((drce[i].attributes & 0x10) == 0x10){
  18. kputs("Directory name: %s\n", drce[i].file_name);
  19. continue;
  20. }
  21.  
  22. /* If the first byte of file_name is 0xE5, means that the file is deleted */
  23. if (drce[i].file_name[0] == FAT32_DELETED_FILE)
  24. continue;
  25. /* This should print the names of the files that are in the root directory... */
  26. printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
  27. file_names_in_dir[aaa] = drce[aaa].file_name;
  28. ++files_in_directory;
  29. ++aaa;
  30. }
  31. }
  32.  
O es que soy tonto o no he dormido nada que estoy bien palurdo.  :P
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: [C] Tratando de crear array de strings
« Respuesta #6 en: 8 Junio 2019, 23:00 pm »

La nueva variable <aaa> (que espero que le pongas un nombre mejor :xD) controla sólo <files_names_in_dir>. Es decir que tendría que ser:
Código
  1. file_names_in_dir[aaa] = drce[i].file_name;
  2. ++aaa;

De todas formas, por si el error no es sólo ese y no consigues solucionarlo, para la próxima pon la salida que obtienes literalmente para que veamos mejor a qué se puede deber.
Yo quitaría los <continue> de todas formas y los <break> como ya te he comentado... :silbar:
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: [C] Tratando de crear array de strings
« Respuesta #7 en: 8 Junio 2019, 23:16 pm »

La nueva variable <aaa> (que espero que le pongas un nombre mejor :xD) controla sólo <files_names_in_dir>. Es decir que tendría que ser:
Código
  1. file_names_in_dir[aaa] = drce[i].file_name;
  2. ++aaa;

De todas formas, por si el error no es sólo ese y no consigues solucionarlo, para la próxima pon la salida que obtienes literalmente para que veamos mejor a qué se puede deber.
Yo quitaría los <continue> de todas formas y los <break> como ya te he comentado... :silbar:
El resultado es el mismo, sobre los continue después lo arreglo...
Bueno, aca la salida literal:
Código:
HELLO   TXT (16 veces)
El feliz pájaro hindú comia feliz cardillo mientras la cigüeña tocaba el saxofón. (16 veces más)
Ni idea de donde salio la ultima string, talvez sucedio la gran casualidad que entre en la memoria de otro proceso que tiene ese string.
« Última modificación: 8 Junio 2019, 23:22 pm por hextakatt » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: [C] Tratando de crear array de strings
« Respuesta #8 en: 8 Junio 2019, 23:35 pm »

Es posible que esa segunda línea sea el contenido de alguno de los ficheros.
He de decir que no sé cómo funciona la siguiente instrucción por lo que doy por hecho que su funcionamiento es correcto:
Código
  1. hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);

Tampoco sé si la salida que obtienes es a partir de los <printf()> y <kputs()> que se ven en la función o la obtienes mostrando después el contenido de <files_names_in_dir>.
Además la variable <aaa> la has declarado globalmente por lo que puede que estés modificando su valor en otro punto del programa o estés llamando más de una vez a esa función.
Y si de paso puedo conocer la estructura de directorios y ficheros con los que estás trabajando, es decir, su nombre. Y que compruebes que esa segunda salida no sea el contenido de alguno de los ficheros.

Lo siento pero es que hay demasiadas cosas que me estoy teniendo que imaginar...
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: [C] Tratando de crear array de strings
« Respuesta #9 en: 8 Junio 2019, 23:39 pm »

Igualmente gracias. Es raro por que antes si funcionaba sin problemas, y se rompio todo de la nada.
Saludos  :)
« Última modificación: 8 Junio 2019, 23:47 pm por hextakatt » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reordernar array de strings aleatoriamente (Ayuda)
Programación Visual Basic
katanaia 2 1,865 Último mensaje 25 Noviembre 2008, 19:27 pm
por cobein
Separación de caracteres en Strings y guardado en array
Java
Debci 4 6,055 Último mensaje 18 Septiembre 2009, 06:39 am
por Skeletron
FindWindow con array de strings
Programación C/C++
while 4 2,621 Último mensaje 9 Noviembre 2010, 21:56 pm
por while
(Ayuda) Array de strings.
Programación C/C++
S++ 4 2,816 Último mensaje 11 Junio 2015, 03:59 am
por rir3760
Problema con array de strings
Programación C/C++
JaimeGc05 3 1,688 Último mensaje 20 Enero 2019, 20:44 pm
por JaimeGc05
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines