Autor
|
Tema: Problema pasar matriz por referencia a una función en C (Leído 4,186 veces)
|
juligarc10
Desconectado
Mensajes: 47
|
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. int trocear(char * cadena, char * trozos[]) { int i=1; if ((trozos [0]=strtok(cadena ," \n\t"))==NULL ){ return 0; //printf("%s\n", trozos[0]); } while ((trozos [i ]=strtok(NULL ," \n\t"))!=NULL ){ //printf("%s\n", trozos[i]); i++; } return i; } /*****************************************************************/ void procesarEntrada(char entrada[]){ char trozos[10][10]; //char *tr; char *tr; tr = trozos[0]; trocear(entrada, &tr); }
Gracias de antemano. Un saludo. MOD: Etiquetas de código GeSHi adaptadas a lenguaje C
|
|
« Última modificación: 25 Septiembre 2020, 15:59 pm por K-YreX »
|
En línea
|
|
|
|
K-YreX
|
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: #define SIZE 50 int main(){ char *cadena = "Esta es una cadena de prueba"; // Array bidimensional [SIZE][SIZE] con memoria dinamica: char **palabras = (char**)malloc(SIZE * sizeof(char*)); for(size_t i = 0; i < SIZE; ++i){ palabras [i ] = (char*)malloc(SIZE * sizeof(char)); } int numero_palabras = trocear(cadena, palabras); for(size_t i = 0; i < numero_palabras; ++i){ printf("Palabra %i: %s\n", i +1, palabras [i ]); } // Al terminar tienes que liberar la memoria reservada dinamicamente for(size_t i = 0; i < SIZE; ++i){ } }
Si quieres usar un array de manera estática tienes que definir la función trocear() como: 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
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
juligarc10
Desconectado
Mensajes: 47
|
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: #define SIZE 50 int main(){ char *cadena = "Esta es una cadena de prueba"; // Array bidimensional [SIZE][SIZE] con memoria dinamica: char **palabras = (char**)malloc(SIZE * sizeof(char*)); for(size_t i = 0; i < SIZE; ++i){ palabras [i ] = (char*)malloc(SIZE * sizeof(char)); } int numero_palabras = trocear(cadena, palabras); for(size_t i = 0; i < numero_palabras; ++i){ printf("Palabra %i: %s\n", i +1, palabras [i ]); } // Al terminar tienes que liberar la memoria reservada dinamicamente for(size_t i = 0; i < SIZE; ++i){ } }
Si quieres usar un array de manera estática tienes que definir la función trocear() como: 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
|
En el caso de utilizar la función: 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. int trocear(char cadena[], char trozos[][SIZE], int filas){ int num_trozos = 0; char *p = strtok(cadena , " \n\t"); while(p && num_trozos < filas){ strncpy(p , trozos [num_trozos ], SIZE ); trozos[num_trozos++][SIZE-1] = '\0'; // para asegurar que cada trozo acaba con \0 } return num_trozos; }
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Pasar matriz char a una función como referencia
Programación C/C++
|
KISKE
|
2
|
7,867
|
18 Junio 2013, 13:07 pm
por KISKE
|
|
|
consulta pasar una matriz a una funcion
Programación C/C++
|
feedf
|
8
|
4,372
|
30 Junio 2013, 00:50 am
por feedf
|
|
|
Pasar solo una columna de una matriz como argumento de una funcion
Programación C/C++
|
Javier_Fig
|
4
|
3,264
|
22 Septiembre 2015, 18:24 pm
por A.I.
|
|
|
Pasar un campo(miembro) de una estructura a función por referencia.[C]
Programación C/C++
|
NOB2014
|
1
|
2,222
|
17 Enero 2017, 17:53 pm
por NOB2014
|
|
|
como pasar una matriz a una funcion
Programación C/C++
|
hector hernadez
|
2
|
5,999
|
15 Octubre 2017, 22:02 pm
por engel lex
|
|