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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  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,984 veces)
programator11

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Espacios en concatenación strcat.
« en: 5 Agosto 2014, 13:17 pm »

Buenas que tal.

Mi problema es el siguiente, quiero hacer un programa que vaya concatenando las palabras que yo vaya introduciendo por teclado, el problema es que no se como hacer para que se concatenen con un espacio cada palabra (aaa bbb en lugar de aaabbb)

He probado a concatenar un espacio a cada palabra que se introduzc pero no obtengo resultado,aqui mi codigo;

Código:
..........
.........
void funcion()
   {
    char cad[100],pal[18];
    char seg;
    int cont=0;
do
    {
      if (cont==0)
      {
      printf ("\nIntroduzca la primera palabra\n\n");
      scanf ("%s",&pal);
        strcat (cad,pal);
      cont++;
      }
     
      else
      {
      printf ("\nIntroduzca la siguiente palabra de la frase:\n");
      scanf ("%s",&pal);
      strcat (cad,pal);
      }
        printf( "\nSi quieres seguir alargando la frase pulsa S, sino pulsa cualquier otra letra:\n" );
    fflush(stdin);
        scanf( "%c", &c);
   } while ( c == 's' );
    printf ("\n\nLa frase final es \n\n%s",cad);


Gracias de antemano  :)


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #1 en: 5 Agosto 2014, 13:23 pm »

Que tal algo del tipo...

Código
  1. char buffer[ 100 ];
  2. strcat( buffer, "palabra1" );
  3. strcat( buffer, " " );
  4. strcat( buffer, "palabra2" );

Por cierto, esta línea, por ejemplo:

Código
  1. scanf ("%s",&pal);

Está mal... pal es de por sí un puntero, si pasas la referencia en vez del puntero vas a escribir donde no debes.

Además:

Código
  1. char cad[ 100 ];
  2. // ...
  3. strcat( cad, pal );

¿Dónde has inicializado "cad"?? strcat concatena a partir del final de cadena, es decir, de que encuentra el carácter nulo... si la cadena no está inicializada vas a tener basura y la función va a concatenar donde le de la gana... y seguro que no coincide con el sitio donde tú quieres que escriba.


« Última modificación: 5 Agosto 2014, 13:26 pm por eferion » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #2 en: 5 Agosto 2014, 15:56 pm »

Buenas que tal.

Mi problema es el siguiente, quiero hacer un programa que vaya concatenando las palabras que yo vaya introduciendo por teclado, el problema es que no se como hacer para que se concatenen con un espacio cada palabra (aaa bbb en lugar de aaabbb)


Además de la solución que te dio eferion te propongo otra alternativa.

Para empezar sacaría el primer scanf del do-while, ya que la primera palabra y la segunda son escaneadas impepinablemente siendo ya optativas las siguientes. Con eso ahorras la variable cont y te evitas el if-else del do-while.

Y 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. /***************************************************/
  2.  
  3.  char c , cad[100] = "" , pal[18] ;
  4.  
  5.  printf ( "\nIntroduzca la primera palabra\n\n" ) ;
  6.  scanf ( "%s"  ,pal ) ;
  7.  sprintf ( cad , "%s%s" , cad  , pal ) ;
  8.  
  9.  do {
  10.    printf ( "\nIntroduzca la siguiente palabra de la frase:\n" ) ;
  11.    scanf ( "%s" , pal) ;
  12.    sprintf ( cad , "%s%c%s" , cad , ' ' , pal ) ;
  13.    printf( "\nSi quieres seguir alargando la frase pulsa S, sino pulsa cualquier otra letra:\n" ) ;
  14.    scanf( " %c", &c) ; /* Observa el espacio en blanco antesde %c para limpiar el '\n' del scanf previo */
  15.  } while ( c == 's' ) ;
  16.  
  17.   printf ( "\n\nLa frase final es \n\n%s" , cad ) ;
  18.  
  19. /********************************************************/

Y respecto al uso de scanf y  fflush (stdin) te aconsejaría leer lo que no hay que hacer en C/C++. Nivel basico.

En cualquier caso si veo necesario el uso de una condición que controle el tamaño de la cadena "cad" tal que si se supere su tamaño aborte el ciclo y no permita añadir más palabras pues en caso contrario se iría más allá de la dimensión de la mencionada cadena cad.También es necesario controlar que la variable "palabra" introducida sucesivamente no supere en cada caso su tamaño y tienes ejemplo de eso en el enlace anterior. Eso ya te lo dejo a ti aunque es sencillito.  ;)

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


« Última modificación: 5 Agosto 2014, 16:11 pm por leosansan » En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #3 en: 5 Agosto 2014, 16:55 pm »

O podrías implementar tu propia versión de strcat así para ajustarlo a tus necesidades y evitar tantas llamadas de la versión estándar :

Código
  1. char *my_strcat(char *s, char esp, char *cad)
  2. {
  3.    char *save = s;
  4.  
  5.    for (; *s; ++s);
  6. *s = esp;
  7.    while ((*++s = *cad++) != '\0');
  8.  
  9.    return(save);
  10. }
  11.  
  12. int main(void)
  13. {
  14.    char s[80] = "hola";
  15.    char p[80] = "mundo";
  16.  
  17.    my_strcat(s, ' ', p);
  18.  
  19.    printf("%s", s);
  20.  
  21.    return 0;
  22. }
  23.  

Saludos
« Última modificación: 5 Agosto 2014, 17:44 pm por Blaster » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #4 en: 5 Agosto 2014, 17:12 pm »

O podrías implementar tu propia versión de strcat así para ajustarlo a tus necesidades y evitar tantas llamadas de la versión estándar :

Código
  1. char *my_strcat(char *s, char esp, char *cad)
  2. {
  3.    char *save = s;
  4.  
  5.    for (; *s; ++s);
  6. *s = esp;
  7.    while ((*++s = *cad++) != '\0');
  8.  
  9.    return(save);
  10. }
  11.  
  12. int main(void)
  13. {
  14.    char s[7] = "hola";
  15.    char p[] = "mundo";
  16.  
  17.    my_strcat(s, ' ', p);
  18.  
  19.    printf("%s", s);
  20.  
  21.    return 0;
  22. }
  23.  

Saludos

Eres consciente que tu ejemplo escribe fuera del buffer, no?? ... o perdón, hablando con propiedad... provoca buffer overflow.

A ver, ya puestos, no tiene mucho sentido que el "remedio" consista en crear una versión de strcat que permita concatenar dos cadenas por vez en vez de una...

Si pretendemos ahorrar llamadas al menos tenemos que intentar hacerlo con un poco de sentido... no viene a cuento reinventar la rueda... ten por seguro que la implementación de la librería estándar es, en el peor de los casos, igual de eficiente que la tuya... lo lógico es que esa versión tienda a ser más eficiente que la tuya. Y aunque esta no fuese razón suficiente, piensa que la librería estándar va a tener muchos menos errores de código que tu versión... además que te evitas tener que mantener ese código.

Código
  1. char* my_strcat( char*s, const char*cad )
  2. {
  3.  if ( *s != 0 )
  4.    strcat( s, " " );
  5.  
  6.  strcat( s, cad );
  7.  
  8.  return s;
  9. }

Pd.: tampoco he entendido muy bien la utilidad de la variable "save";

« Última modificación: 5 Agosto 2014, 17:18 pm por eferion » En línea

Blaster

Desconectado Desconectado

Mensajes: 190


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

Eres consciente que tu ejemplo escribe fuera del buffer, no?? ... o perdón, hablando con propiedad... provoca buffer overflow.

Uff es que lo estaba probando y olvide ponerle el tamaño actual gracias por la observación

Saludos
« Última modificación: 5 Agosto 2014, 17:45 pm por Blaster » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #6 en: 5 Agosto 2014, 17:29 pm »

Uff es que lo estaba probado y olvide ponerle el tamaño actual gracias por la observación

Saludos

Son cosas que pasan... es que lo he visto nada más ver el código... que, dicho sea de paso, no es culpa de la función sino de cómo ha sido declarada la variable.
En línea

Swain

Desconectado Desconectado

Mensajes: 29



Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #7 en: 5 Agosto 2014, 17:51 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


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char *funcion(){
  6. char *frase;
  7. bool cont = true;  // CONDICIONAL PARA CONTINUAR O SALIR
  8. char aux[50]; /// MAXIMO 50 CARACTERES POR PALABRA
  9. frase = (char *)malloc(sizeof(aux));// INICIO CON AL MENOS CON 1 PALABRA
  10. memset(frase,'\0',strlen(frase));
  11. while(cont){
  12. memset(aux,'\0',sizeof(aux)); //LIMPIO AUXILIAR ANTES DE COMENZAR
  13. printf("escribe palabra: ");
  14. scanf("%s",&aux);
  15. sprintf(frase,"%s %s",frase,aux); //CONCATENO FRASE ARMADA + PALABRA
  16. printf("Dese continuar?(y/n)");
  17. memset(aux,'\0',sizeof(aux));
  18. scanf("%s",&aux);
  19. if(aux[0] == 'n' || aux[0] == 'N') //SI EMPIEZA CON N o n SALGO
  20. cont = false;
  21.       frase = (char *)realloc(frase,sizeof(aux)+strlen(frase)); //PIDO MAS ESPACIO
  22. }
  23.  
  24. return frase; // DEVUELVO LA FRASE TERMINADA
  25. }
  26.  
  27.  
  28. int main(){
  29.  
  30. printf("la frase es: %s\r\n",funcion());
  31. return 0;
  32. }
  33.  
En línea

No me sigas.
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #8 en: 5 Agosto 2014, 17:58 pm »

Si no sabes el largo que va a tomar la frase tienes que usar punteros

... y si sabes la longitud ... también.

Las cadenas de caracteres van siempre con punteros.

PD.: lo siento hoy estoy quisquilloso... te falta un free so pena de tener lagunas de memoria.

PD2.: hay que tener cuidado con las reservas de memoria ( malloc, calloc, realloc ). Estas funciones están pensadas para hacer reservas grandes de memoria... con reservas pequeñas son bastante ineficientes... además, realloc tiene el problema añadido de mover información de una posición de memoria a otra... luego andar haciendo realloc cada dos por tres no parece una opción muy atractiva... casi es mejor hacer realloc de forma exponencial... reservando bloques cada vez más grandes de memoria precisamente para realizar la menor cantidad de llamadas posibles. Escatimar recursos a este nivel solo es útil en sistemas empotrados o con recursos escasos, en el resto de casos no merece la pena.
En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Espacios en concatenación strcat.
« Respuesta #9 en: 5 Agosto 2014, 18:45 pm »

ten por seguro que la implementación de la librería estándar es, en el peor de los casos, igual de eficiente que la tuya... lo lógico es que esa versión tienda a ser más eficiente que la tuya. Y aunque esta no fuese razón suficiente, piensa que la librería estándar va a tener muchos menos errores de código que tu versión... además que te evitas tener que mantener ese código.

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
« Última modificación: 6 Agosto 2014, 06:21 am por Blaster » En línea

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,477 Ú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,713 Ú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