Título: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: NOB2014 en 3 Octubre 2016, 23:02 pm Hola a todos.
Alguien me podría decir como solucionar el siguiente error: Citar repaso.c: In function ‘main’: repaso.c:44:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=] printf( "\n %s ", frases[n] ); ^ Créanme que con lo tedioso que me resulta buscar la solución en inglés lo hice por un montón de páginas y no logré dar con la solución, creo que el error lo tengo en la línea 29 pero no lo logro. Código dato000 gracias por ocuparte del tema anterior. - Saludos Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: MAFUS en 4 Octubre 2016, 01:07 am frases no es un array de cadenas, es solo una cadena, prueba de ello es su definición:
char *frases para que sea un array dinámico de frases deberías hacer char **frases después a cada frase nueva haces crecer el puntero con calloc Código: char frases = calloc(frases, (tam_frases + 1) * sizeof(char*)) seguidamente cargas la nueva frase al array Código: scanf("%m[^\n]%*c", &frases[tam_frases]); y actualizas tam_frases Código: ++tam_frases Para acabar acuérdate de liberar toda la memoria adquirida por scanf para cada cadena. Código: for(i = 0; i < tam_frases; ++i) Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: NOB2014 en 4 Octubre 2016, 01:37 am Hola, MAFUS.
En mucho tiempo es la primera vez que no me resulta(tus ayudas) y además no entiendo los trozos de código que propones, por lo tanto, voy a intentarlo de otra manera, estoy desconcertado, tal vez otra propuesta me aclare las cosas. - Un abrazo. - Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: geeke en 4 Octubre 2016, 03:09 am También puedes usar array de punteros
Código
Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: MAFUS en 4 Octubre 2016, 11:30 am Un array de cadenas es fijo, no podrá crecer más si así lo necesita.
En unas horas te voy a pasar un código ejecutable que pone en práctica lo que te he dicho. Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: NOB2014 en 4 Octubre 2016, 12:59 pm Hola, que tengan un muy buen día. -
De tanto buscar encontré un Ej. que si bien estaba en c++ lo pude adaptar, este código cumple con todas mis expectativas en cuanto a lo que necesitaba sobre el tema, seria bueno que además del código de MAFUS (que deseo con muchas ansias verlo editado) alguien más de su versión de como haria lo mismo pero con otro código. - Código
Un fuerte abrazo para todos. Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: MAFUS en 4 Octubre 2016, 15:44 pm Como verás hace uso de argumentos no tan comunes en scanf, pero con ellos obtengo el dato que quiero y además me libero de \n en el buffer, todo en la misma línea.
Código
Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: dato000 en 4 Octubre 2016, 15:55 pm (http://images1.tickld.com/live/612826.gif)
no puedo parar de reir con ese gif, siempre que lo veo me quedo mirandolo como un idiota contento. dato000 gracias por ocuparte del tema anterior. - Saludos Yo que hice??? en fin, slds Creo que ya todo esta dicho, punteros no es mi fuerte, pero lo que tengo que añadir del codigo de MAFUS es que no es estandar esa asignación scanf("%m") y que puede variar su resultado dependiendo del compilador, pues he visto casos en los que al recibir caracter espacio o salto de linea obtiene un desbordamiento y almacena basura en un espacio de memoria aleatorio después de la primera palabra de una serie de caracteres, pues scanf se supone que es más para memoria estatica. Aunque supongo que con la extensión del estandar y las librerias apropiadas junto con un compilador actualizado ese problema seria resuelto y se usaria como un realloc verdadero. Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: NOB2014 en 4 Octubre 2016, 16:29 pm Yo que hice??? en fin, slds http://foro.elhacker.net/programacion_cc/arreglo_de_apuntadores_vs_arreglo_comun_en_lenguaje_c-t458486.0.html Título: Re: Arreglo de cadenas con memoria dinámica (realloc) lenguaje C. Publicado por: MAFUS en 4 Octubre 2016, 17:42 pm La opción %m está incluida en el estándar POSIX.1-2008: http://pubs.opengroup.org/onlinepubs/9699919799/
Si se usa con %ms no recogerá toda la línea ya que el modificador %s se detiene en el primer carácter en blanco. Para ello se usa el %[^\n] que recoge toda la línea hasta el final o hasta encontrarse un carácter de nueva línea. Como nota adicional el %*c al final de la cadena de control hace que se recoja el carácter de nueva línea pero no se asigne a ningún sitio, así se quita del buffer de entrada. |