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


 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema pasar matriz por referencia a una función en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema pasar matriz por referencia a una función en C  (Leído 619 veces)
juligarc10

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Problema pasar matriz por referencia a una función en C
« en: 25 Septiembre 2020, 13:49 »

Hola amigos, estoy tratando de hacer una función que trocea una cadena, y la separa en los espacios, guardando cada palabra en una fila de la matriz. Para eso la paso por referencia (es decir, con un puntero) a la función trocear(), que ya he comprobado que funciona. Mi problema es que una vez que trocea, y en teoría se modifican los datos, no sé como acceder a los datos guardados. Paso código.
Código
  1. int trocear(char * cadena, char * trozos[])
  2. {
  3.        int i=1;
  4. if ((trozos[0]=strtok(cadena," \n\t"))==NULL){
  5. return 0;
  6. //printf("%s\n", trozos[0]);
  7. }
  8. while ((trozos[i]=strtok(NULL," \n\t"))!=NULL){
  9. //printf("%s\n", trozos[i]);
  10. i++;
  11. }
  12. return i;
  13. }
  14.  
  15. /*****************************************************************/
  16.  
  17. void procesarEntrada(char entrada[]){
  18. char trozos[10][10];
  19. //char *tr;
  20. char *tr;
  21. tr = trozos[0];
  22. trocear(entrada, &tr);
  23. }

Gracias de antemano. Un saludo.


MOD: Etiquetas de código GeSHi adaptadas a lenguaje C


« Última modificación: 25 Septiembre 2020, 15:59 por K-YreX » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 759



Ver Perfil
Re: Problema pasar matriz por referencia a una función en C
« Respuesta #1 en: 25 Septiembre 2020, 17:17 »

Tienes varias opciones para hacer lo que quieres.

Si dejas la función trocear() tal y como la tienes, tienes que utilizar memoria dinámica:
Código
  1. #define SIZE 50
  2. int main(){
  3.    char *cadena = "Esta es una cadena de prueba";
  4.    // Array bidimensional [SIZE][SIZE] con memoria dinamica:
  5.    char **palabras = (char**)malloc(SIZE * sizeof(char*));
  6.    for(size_t i = 0; i < SIZE; ++i){
  7.        palabras[i] = (char*)malloc(SIZE * sizeof(char));
  8.    }
  9.    int numero_palabras = trocear(cadena, palabras);
  10.    for(size_t i = 0; i < numero_palabras; ++i){
  11.        printf("Palabra %i: %s\n", i+1, palabras[i]);
  12.    }
  13.    // Al terminar tienes que liberar la memoria reservada dinamicamente
  14.    for(size_t i = 0; i < SIZE; ++i){
  15.        free(palabras[i]);
  16.    }
  17.    free(palabras);
  18. }

Si quieres usar un array de manera estática tienes que definir la función trocear() como:
Código
  1. int trocear(char *cadena, char palabras[][SIZE]);
(Es optativo especificar el tamaño de la primera dimensión de un array pero para el resto de dimensiones es obligatorio)


En línea

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

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: Problema pasar matriz por referencia a una función en C
« Respuesta #2 en: 25 Septiembre 2020, 18:13 »

Tienes varias opciones para hacer lo que quieres.

Si dejas la función trocear() tal y como la tienes, tienes que utilizar memoria dinámica:
Código
  1. #define SIZE 50
  2. int main(){
  3.    char *cadena = "Esta es una cadena de prueba";
  4.    // Array bidimensional [SIZE][SIZE] con memoria dinamica:
  5.    char **palabras = (char**)malloc(SIZE * sizeof(char*));
  6.    for(size_t i = 0; i < SIZE; ++i){
  7.        palabras[i] = (char*)malloc(SIZE * sizeof(char));
  8.    }
  9.    int numero_palabras = trocear(cadena, palabras);
  10.    for(size_t i = 0; i < numero_palabras; ++i){
  11.        printf("Palabra %i: %s\n", i+1, palabras[i]);
  12.    }
  13.    // Al terminar tienes que liberar la memoria reservada dinamicamente
  14.    for(size_t i = 0; i < SIZE; ++i){
  15.        free(palabras[i]);
  16.    }
  17.    free(palabras);
  18. }

Si quieres usar un array de manera estática tienes que definir la función trocear() como:
Código
  1. int trocear(char *cadena, char palabras[][SIZE]);
(Es optativo especificar el tamaño de la primera dimensión de un array pero para el resto de dimensiones es obligatorio)

Muchas gracias por tu respuesta, ha sido de gran ayuda. De todas formas me gustaría preguntarte como implementaría la segunda opción. Le pasaría a la función un char palabras[][SIZE], pero despues como operaría con el dentro de la función? Me refiero sobre todo a los strtok y eso...

Gracias.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 759



Ver Perfil
Re: Problema pasar matriz por referencia a una función en C
« Respuesta #3 en: 27 Septiembre 2020, 23:25 »

En el caso de utilizar la función:
Código
  1. int trocear(char cadena[], char trozos[][SIZE]);
tendrías que crear un puntero a char para usarlo en la función strtok y después copiar su contenido mediante strncpy().
Además lo suyo sería pasar como tercer parámetro el número de filas de <trozos> para evitar problemas de acceso en la función.
Código
  1. int trocear(char cadena[], char trozos[][SIZE], int filas){
  2.  int num_trozos = 0;
  3.  char *p = strtok(cadena, " \n\t");
  4.  while(p && num_trozos < filas){
  5.    strncpy(p, trozos[num_trozos], SIZE);
  6.    trozos[num_trozos++][SIZE-1] = '\0'; // para asegurar que cada trozo acaba con \0
  7.    p = strtok(NULL, " \n\t");
  8.  }
  9.  return num_trozos;
  10. }
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines