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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


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

Desconectado Desconectado

Mensajes: 29


Ver Perfil WWW
insertar palabra por palabra a una matriz
« en: 20 Octubre 2012, 04:47 am »

Buenas, quería leer desde un archivo y almacenar palabra por palabra en una matriz, por lo que cada uno de los vectores almacenaré una palabra.

He intentado hacerlo, pero sin éxito, en que me estaré confundiendo??

Código
  1. char** matriz = (char**)malloc(sizeof(char*)*512);
  2. leer("texto.txt", matriz, 10);

Código
  1. #include <stdio.h>
  2.  
  3. void leer(char *archivoTexto, char** matriz, int palabras){
  4.  
  5. FILE* archivo;
  6. int i = 1;
  7. char linea [sizeof(matriz)];
  8.  
  9. if((archivo = fopen(archivoTexto, "r")) == NULL){
  10. perror("error al abrir el fichero texto.txt\n");
  11. }
  12. else{
  13. while(fgets(linea, sizeof(linea), archivo)){
  14. matriz[0] = strtok(linea, " ");
  15. printf("%s ", matriz[0]);
  16. for( ;(matriz[i] = strtok( NULL, " ")) != NULL && i < palabras; i++){
  17. printf("%s ", matriz[i]);
  18. }
  19. }
  20. }
  21. }
PD:
1º argumento: nombre del archivo que quiero leer
2º argumento: la matriz donde quiero insertar las palabras (1 en cada vector)
3º argumento: las cantidad de palabras que quiero insertar a la matriz

Pero justo cuando se imprime las palabras desde la matriz, lo único que me imprime es (null)



En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: insertar palabra por palabra a una matriz
« Respuesta #1 en: 20 Octubre 2012, 14:25 pm »

estas reservando memoria para un array de punteros a caracter, pero luego no reservas memoria para cada uno de esos punteros. suponiendo que quieres que la matriz contenga NumPal palabras y que cada palabra tenga un maximo de NumLet letras (sin incluir el NULL al final):

Código
  1. char** matriz=(char**)malloc(NumPal*sizeof(char*));
  2. for (j=0; j<NumPal; j++) matriz[j]=(char*)malloc((NumLet+1)*sizeof(char));

y al final de programa, no te olvides de liberar la memoria reservada:

Código
  1. for (j=0; j<NumPal; j++) free(matriz[i]);
  2. free(matriz);

un saludo!


En línea

Fabi0lo

Desconectado Desconectado

Mensajes: 29


Ver Perfil WWW
Re: insertar palabra por palabra a una matriz
« Respuesta #2 en: 20 Octubre 2012, 17:16 pm »

Gracias, no sabía que había que reservar también cada uno de los vectores, pensaba que con tener la matriz reservada ya estaba para llegar y escribir en ella.

Pero sin embargo el problema insiste, de hecho, luego de declarar la matriz con sus vectores, verifico su tamaño con sizeof(matriz), me retorna 8, por lo que el String linea tiene tamaño 8, le puse tamaño 1024, ya que si leo un párrafo, este no tiene salto de lineas, es una linea continua hasta que llega a un punto aparte.

Código
  1. char** matriz = (char**)malloc(sizeof(char*)*numPal);
  2. for (j=0; j<numPal; j++) matriz[j] = (char*)malloc(15*sizeof(char));

Código
  1. void leer(char *archivoTexto, char** matriz, int palabras){
  2.  
  3. FILE* archivo;
  4. int i = 1;
  5. char linea [1024];
  6.  
  7. if((archivo = fopen(archivoTexto, "r")) == NULL){
  8. perror("error al abrir el fichero\n");
  9. }
  10. else{
  11. while(fgets(linea, sizeof(linea), archivo)){
  12. matriz[0] = strtok(linea, " ");
  13. printf("%s ", matriz[0]);
  14. for( ;(matriz[i] = strtok( NULL, " ")) != NULL && i < palabras; i++){
  15. printf("%s ", matriz[i]);
  16. }
  17. }
  18. }
  19. printf("\n\n");
  20. }

Por cierto... soy nuevo en C y aun no capto miles de cosas, cuando me mostraste como asignarle memoria a matriz con malloc "(char**)malloc(NumPal*sizeof(char*))", no le estoy asignando el tamaño de memoria NumPal a toda la matriz? o le estoy asignando ese tamaño a cada vector?

PD2: Apesar del cambio, sizeof(matriz) me sigue arrojando tamaño 8, pero sin embargo, la matriz almacena todo el texto, que es lo que me está devolviendo sizeof??
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: insertar palabra por palabra a una matriz
« Respuesta #3 en: 20 Octubre 2012, 18:17 pm »

El operador "sizeof" resulta en el tamaño del objeto, por ejemplo:
Código
  1. char *p = malloc(100);
  2. size_t num_elem = sizeof p;
Ahi el resultado de ""sizeof p" es "sizeof(char *)", usualmente cuatro.


Si lo que se desea no es el tamaño del puntero sino del objeto apuntado (el resultado de malloc, el bloque de cien caracteres) no hay mas opción que llevar la cuenta de forma "manual" (mediante una variable):
Código
  1. char *p = malloc(100);
  2. size_t num_elem = 100;


Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Leer palabra por palabra
PHP
WannaBeHacker 4 7,753 Último mensaje 29 Agosto 2007, 00:04 am
por WannaBeHacker
Ayuda con Seleccionar Palabra por Palabra
Programación Visual Basic
RickJack 6 5,390 Último mensaje 15 Septiembre 2008, 23:47 pm
por RickJack
Como hacer /una/palabra/ en vez de ?1=una&2=palabra « 1 2 3 »
PHP
dimitrix 20 9,678 Último mensaje 14 Enero 2010, 00:24 am
por dimitrix
contar caracteres de una palabra y devolver que palabra es en java
Java
Cooltan 4 23,530 Último mensaje 6 Abril 2011, 12:21 pm
por Cooltan
Duda sobre seleccionar palabra por palabra en RichTextBox (vb.net)
.NET (C#, VB.NET, ASP)
Susoch 3 6,650 Último mensaje 19 Enero 2012, 18:15 pm
por Susoch
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines