Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juligarc10 en 25 Septiembre 2020, 13:49 pm



Título: Problema pasar matriz por referencia a una función en C
Publicado por: juligarc10 en 25 Septiembre 2020, 13:49 pm
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


Título: Re: Problema pasar matriz por referencia a una función en C
Publicado por: K-YreX en 25 Septiembre 2020, 17:17 pm
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)


Título: Re: Problema pasar matriz por referencia a una función en C
Publicado por: juligarc10 en 25 Septiembre 2020, 18:13 pm
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.


Título: Re: Problema pasar matriz por referencia a una función en C
Publicado por: K-YreX en 27 Septiembre 2020, 23:25 pm
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. }