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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Espacios en concatenación strcat.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Espacios en concatenación strcat.  (Leído 6,987 veces)
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #10 en: 5 Agosto 2014, 20:25 pm »

Si no sabes el largo que va a tomar la frase tienes que usar punteros
pero para cada palabra puedes asignarle un espacio TOPE

Me ha gustado el uso del puntero con asignación dinámica de memoria, eso sí con lo que tan acertadamente comenta eferion respecto a dicha asignación así como el uso del bool.  ;-)

Sólo unos pequeñitos detalles:

* creo que falta la librería stdbool.h
* ¿No te sobra el "&" en los scanf al tratarse de arrays?.
* Tal como lo tienes, introduce un espacio en blanco al comienzo de la frase, cosa que no procede.
* ¿Es tan necesario el uso de memset?. Para inicializar "frase " podríamos usar calloc, en lugar de malloc, y respecto a inicializar a la variable "aux", ¿es tan necesario?. Dudas, dudas ..... :rolleyes:
* Podemos ahorrarnos uno de los scanf haciendo la pregunta al entrar la frase.

Son sólo detallitos sin mayor importancia pero creo que eferion me ha contagiado el estado "quisquilloso" hoy.  :laugh:

Pero insisto, me ha gustado la aportación, tanto que con tu permiso la modifico para tener en cuenta los pequeñitos detalles que mencioné:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5.  
  6. char *funcion ( char *frase ) {
  7.  bool cont = true ;
  8.  char aux [ 50 ] ;
  9.  frase = calloc ( sizeof  aux , sizeof ( char ) ) ;
  10.  printf("\nEscribe una palabra ( n para salir ): ") ;
  11.  scanf ( "%s" , aux ) ;
  12.  strcpy( frase , aux ) ;
  13.  while ( cont ) {
  14.    printf("\nEscribe una palabra ( n para salir ): ") ;
  15.    scanf ( "%s" , aux ) ;
  16.    ( strlen ( aux ) == 1 && ( aux[0] == 'n' || aux[0] == 'N') ) ? cont = false : sprintf ( frase , "%s %s" , frase , aux ) ;
  17.    frase = realloc ( frase , sizeof ( aux ) + strlen ( frase ) ) ;
  18.  }
  19.  return frase ;
  20. }
  21.  
  22. int main( ) {
  23.  char *frase ;
  24.  printf( "\n\nLa frase es:\n\n%s" , funcion ( frase ) ) ;
  25.  free ( frase ) ;
  26.  return EXIT_SUCCESS ;
  27. }

¡¡¡¡ Saluditos! ..... !!!!




En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #11 en: 6 Agosto 2014, 08:35 am »

Dudo que la versión estándar sea tan diferente, es mas apostaría que es igual a:

Código
  1. char *strcat(char *s, const char *cad)
  2. {
  3.    char * save = s;
  4.    for (; *s; ++s);
  5.    while ((*s++ = *cad++) != '\0');
  6.  
  7.    return (save);
  8. }

Y la verdad no sé que la hace tan "eficiente" ya que ni siquiera realiza la validación
pertinente para asegurar que la cadena destino sea lo suficientemente grande para
luego concatenarle la cadena indicada.

Saludos

No estoy hablando de una función concreta... hablo en general.

Porque claro, ya puestos, una vez has creado tu versión de strcat (pensando en que debe funcionar igual que la función estándar)... ¿por qué no hacer una implementación propia de strlen, strcpy, strtok, memcpy, memset... ¿eres capaz de garantizar que tus versiones van a ser igual de óptimas que las versiones estándar? estoy convencido de que no. Si miras el código fuente de algunas de estas funciones verás que están plagadas de compilaciones condicionales... precisamente para optimizar y para sortear eventualidades (no es lo mismo una arquitectura big endian que una little endian, por ejemplo)... y está claro que tú no vas a tener en cuenta estas cosas. Al final, por este camino, tu código acabaría siendo poco eficiente y no portable.... y ese no es el camino.


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #12 en: 7 Agosto 2014, 00:07 am »

No estoy hablando de una función concreta... hablo en general.

 Al final, por este camino, tu código acabaría siendo poco eficiente y no portable.... y ese no es el camino.

Pues usemos dichas funciones. Como ejemplo:

Código
  1. char *my_strcat( char *s , char esp , char *cad ) {
  2.  sprintf ( s , "%s %s" , s , cad)  ;
  3.  return( s ) ;
  4. }


¡¡¡¡ Saluditos! ..... !!!!



En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #13 en: 7 Agosto 2014, 20:05 pm »

para concatenar las palabras usaría la función sprintf con lo que en con sólo una función concateno las palabras:

[...]

Código
  1. sprintf(cad, "%s%c%s", cad, ' ', pal);
Un problema con esa llamada a sprintf es indicar que la cadena debe imprimirse sobre si misma y en caso de utilizar el par strcpy/strcat se tiene el fastidio (con la segunda) de buscar el final de la primera cadena.

En su lugar se puede aprovechar el valor de retorno de sprintf, este es el numero de caracteres generados en base a la cadena de formato sin incluir el '\0'. Un ejemplo basado en el tuyo sin validaciones ni uso de memoria dinámica:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. #define MAX_PAL  50
  7.  
  8. char *funcion(char *frase);
  9.  
  10. int main(void)
  11. {
  12.   char frase[MAX_PAL * 20];
  13.  
  14.   printf("La frase es: \"%s\"\n", funcion(frase));
  15.  
  16.   return EXIT_SUCCESS;
  17. }
  18.  
  19. char *funcion(char *frase)
  20. {
  21.   char pal[MAX_PAL];
  22.   int nc;
  23.  
  24.   puts("Escribe una palabra ( n para salir ):");
  25.   scanf("%s", pal);
  26.   nc = sprintf(frase, "%s", pal);
  27.  
  28.   while (1){
  29.      puts("Escribe una palabra (n para salir):");
  30.      scanf("%s", pal);
  31.  
  32.      if (tolower(*pal) == 'n' && pal[1] == '\0')
  33.         break;
  34.  
  35.      nc += sprintf(frase + nc, " %s", pal);
  36.   }
  37.  
  38.   return frase;
  39. }

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 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Comparacion de una concatenacion
Bases de Datos
proteus8 0 1,601 Último mensaje 14 Febrero 2011, 17:01 pm
por proteus8
strcat
Programación C/C++
<<<-Basura->>> 4 5,479 Último mensaje 26 Abril 2011, 05:37 am
por <<<-Basura->>>
Concatenación ?
Programación C/C++
<<<-Basura->>> 5 3,103 Último mensaje 1 Abril 2012, 20:00 pm
por <<<-Basura->>>
[DUDA] añadir espacios al utilizar la función strcat « 1 2 3 »
Programación C/C++
Dryken 25 15,715 Último mensaje 11 Agosto 2012, 16:28 pm
por rir3760
uso de strcat
Programación C/C++
m@o_614 5 3,022 Último mensaje 22 Diciembre 2013, 22:07 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines