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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [DUDA] añadir espacios al utilizar la función strcat
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: [DUDA] añadir espacios al utilizar la función strcat  (Leído 15,798 veces)
Risketo

Desconectado Desconectado

Mensajes: 37



Ver Perfil
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #10 en: 9 Agosto 2012, 06:35 am »

Yo creo que una de las soluciones podría ser esta:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(){
  6. char puerto[25], ip[25];
  7. char netcat[]="nc";
  8.  
  9.  
  10. printf("Introduce la IP:\t");
  11. scanf(" %s",&ip);
  12. printf("Introduce el puerto:\t");
  13. scanf(" %s",&puerto);
  14.  
  15. strcat(netcat," ");
  16. strcat(netcat,ip);
  17. strcat(netcat," ");
  18. strcat(netcat,puerto);
  19.  
  20. system(netcat);
  21.  
  22. while(getchar() !='\n');  
  23. return 0;
  24.  
  25. }
  26.  

Lo he probado en linux con otra orden en la terminal pero creo que poniendo el #include <windows.h> debería funcionar.


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #11 en: 9 Agosto 2012, 06:57 am »

.
El realizar un strcat() en un buffer es para uno establecido dará POSIBLEMENTE un overflow de indices segun la lontitud de este... por ejemplo:

Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <windows.h>
  5.  
  6. int main(){
  7. char puerto[25], ip[25];
  8. char netcat[]="nc"; // produce un error por que aquí solo hay una dimension de 3 indices... y se requiere una aun mas grande...
  9.  
  10. printf("Introduce la IP:\t");
  11. scanf("%s",&ip);
  12. printf("Introduce el puerto:\t");
  13. scanf("%s",&puerto);
  14. strcat(netcat,ip);
  15. strcat(netcat,puerto);
  16.  
  17. system(netcat);
  18. while(getchar() !='\n');  
  19.  
  20. }
  21.  
  22.  

Estas haciendo la instrucción ya dicha pero dicha instrucción SOLO concatena mas NO redimensiona por lo tando debes tener un 3er buffer donde meter dicha concatenación CON UN BUFFER ADECUADO...

Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <windows.h>
  5.  
  6. int main()
  7. {
  8.    char *res = NULL;
  9.    const char COMANDO[] = "nc ";
  10.    char puerto[25] = {},
  11.         ip[25] = {},
  12.         buffer[sizeof COMANDO + sizeof puerto + sizeof ip - 2] = {}; // el menos 2 es por que dos de las variables tienen un caracter \0 el cual no nos interesan, por que no restar -3? es simple necesitamos un byte '\0'...
  13.  
  14. //    printf("%d\n", sizeof buffer); // oslo para saber cuanto buffer tenemos realmente...
  15.  
  16.    printf("Introduce la IP:\t"); fflush(stdout); // realizo un fflush debido a que en el printf() no termino con \n
  17.    fgets(ip, sizeof puerto - 1, stdin); // con este -1 nos aseguramos que el ultimo byte sea SIEMPRE un \0
  18.  
  19.    printf("Introduce el puerto:\t"); fflush(stdout); // realizo un fflush debido a que en el printf() no termino con \n
  20.    fgets(puerto, sizeof puerto - 1, stdin); // con este -1 nos aseguramos que el ultimo byte sea SIEMPRE un \0
  21.  
  22.    strcat(buffer, COMANDO);
  23.    strcat(buffer, ip);
  24.    strcat(buffer, puerto);
  25.  
  26.    //  sustituimos todos los '\n' por ' '
  27.    res = strpbrk(buffer, "\n");
  28.    while (res) {
  29.        *res = ' ';
  30.        res = strpbrk(res, "\n");
  31.    }
  32.  
  33. //    puts(buffer); // solo para mostrar el comando...
  34.  
  35.    system(buffer);
  36.  
  37.    fflush(stdin); // para que la siguiente instruccion no tenga problemas con el buffer de entrada la vació...
  38.    while(getchar() !='\n');
  39.  
  40.    return 0;
  41. }
  42.  
  43.  

Para mas información: http://www.cplusplus.com/reference/clibrary/cstring/strcat/

Yo me voy a jugar nos vemos.

Dulces Lunas!¡.


« Última modificación: 9 Agosto 2012, 07:08 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
Dryken

Desconectado Desconectado

Mensajes: 117


El arte de vencer se aprende en las derrotas


Ver Perfil WWW
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #12 en: 9 Agosto 2012, 16:31 pm »

Fire544 he probado a dejar el espacio y a cambiar el puerto de cadena (char) a integer (int) pero no es posible tratar con 2 formatos distintos, sólo me permite de char a char o de int a int.

durasno el sprintf claro que me he fijado, tiene la misma función que el strcat, almacena cadenas en una única variable, pero después de eso estoy en las mismas, dejar el espacio al utilizar la función system.

Por cierto bajate el netcat de aquí y copialo a windows/system32

http://netcat.sourceforge.net/download.php

Risketo he probado tu posible solución pero la verdad es que no entiendo porque no permite introducir el espacio tal cual al sumarlo a la cadena, al imprimirlo por pantalla si se muestra pero al cargarlo con el system(); no va  :-\

BlackZeroX (Astaroth) he visto tu código y por lo visto mi error era que no redimensionaba, vamos que se supone que se desborda el código al concatenar, por ello la posibe solución es limpiar el buffer lo mejor posible tal cual tu has echo en tu código, creo que es ese el problema según he entendido.

Me ha dado coraje que tu código con lo trabajado que está y que a simple vista parece que debe solucionar el error, pues que no me lo soluciona, al menos a mi. Le voy a echar ahora un vistazo a tu enlace sobre la función strcat aver que más consigo informarme.

Gracias por la colaboración compañeros, seguro que en verdad es una tonteria resolver este misterio pero menuda tonteria más grande cuando se sepa como se hace.
En línea

Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html
durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #13 en: 10 Agosto 2012, 01:59 am »

Citar
Me ha dado coraje que tu código con lo trabajado que está y que a simple vista parece que debe solucionar el error, pues que no me lo soluciona, al menos a mi. Le voy a echar ahora un vistazo a tu enlace sobre la función strcat aver que más consigo informarme.
esto me parece que pasa por otro lado, y no por los programas que te pasaron ya que cualquiera deberia andar. Preguntas tontas:
¿podes ejecutar nc desde el interprete de comandos?
¿al ejecutar nc con system la consola muestra algo ó se cuelga el programa?


Saludos
En línea

Ahorrate una pregunta, lee el man
Fire544

Desconectado Desconectado

Mensajes: 85


"Escucha el sonido del 0, 1"


Ver Perfil WWW
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #14 en: 10 Agosto 2012, 06:47 am »

Mira he desarrollado una solucion a tu problema, al no tener netcat en mi system32, lo aplique al uso de telnet ya que se le pasan mas de 1 argumento que es lo que quieres, solo que este para otros propositos minusculos, solo tienes que modificar las constantes de printf() y la inicializacion del vector telnet.

Código
  1. #include <stdio.h>
  2. #include <string.h> //tenemos strcat();
  3. #include <stdlib.h> //tenemos system()
  4.  
  5. int main()
  6. {
  7.    char telnet[7]="telnet", ejecutar[40], ip[15], puerto[5];
  8.  
  9.    for(int i=0; i<40; i++)
  10.    {ejecutar[i]='\0';} //llenamos el vector de espacios en blanco, para no dejar basuras !!
  11.  
  12.    printf("IP Server: ");
  13.    gets(ip);
  14.  
  15.    if(strlen(ip)>=15) //comprobamos si se ha llegado al limite del vector y
  16.    {return 1;}         //retornamos 1 en caso contrario no retornamos nada
  17.  
  18.    printf("Puerto Server: ");
  19.    gets(puerto);
  20.  
  21.   if(strlen(puerto)>=5)
  22.    {return 1;}
  23.  
  24.    strcat(ejecutar, telnet);
  25.    strcat(ejecutar, " "); //concatenamos espacios a nuestro vector
  26.    strcat(ejecutar, ip);
  27.    strcat(ejecutar, " ");
  28.    strcat(ejecutar, puerto);
  29.  
  30.    system(ejecutar);
  31.  
  32.    getchar();
  33.    }
  34.  

Suerte !!  ;-)
« Última modificación: 10 Agosto 2012, 15:46 pm por Fire544 » En línea

"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #15 en: 10 Agosto 2012, 07:44 am »

@Fire544
No es recomendable usar scanf() de esa manera...

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #16 en: 10 Agosto 2012, 14:31 pm »

¡Buenas!

Tampoco deberias de empezar haciendo
Código
  1. strcat(ejecutar,telnet);
, ya que no has inicializado ejecutar, y es mas que posible que no empiece por '\0' o incluso que en ninguna de sus posiciones contenga dicho caracter, por lo que strcat podria salirse de la dimension que le has asignado o incluso crashear el programa.

Empieza con strcpy, si sabes que la cadena de origen va a caber dentro del destino, sino, strncpy para asegurarte de que estas dentro de los limites de la memoria asignada.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Fire544

Desconectado Desconectado

Mensajes: 85


"Escucha el sonido del 0, 1"


Ver Perfil WWW
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #17 en: 10 Agosto 2012, 15:39 pm »

BlackZeroX (Astaroth) Comprendo, tienes razon, luego se producirian errores logicos, pero mira esta seria una buena correccion !!

Código
  1. printf("Named Server: ");
  2.    gets(ip);
  3.  
  4.    if(strlen(ip)>=15) //comprobamos que nuestro vector no este al limite de caracteres
  5.    {return 1;} //tambien puedes devolver un mensaje avisando de la falta de espacio
  6.  
En línea

"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".
Fire544

Desconectado Desconectado

Mensajes: 85


"Escucha el sonido del 0, 1"


Ver Perfil WWW
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #18 en: 10 Agosto 2012, 15:51 pm »

¡Buenas!

Tampoco deberias de empezar haciendo
Código
  1. strcat(ejecutar,telnet);
, ya que no has inicializado ejecutar, y es mas que posible que no empiece por '\0' o incluso que en ninguna de sus posiciones contenga dicho caracter, por lo que strcat podria salirse de la dimension que le has asignado o incluso crashear el programa.

Empieza con strcpy, si sabes que la cadena de origen va a caber dentro del destino, sino, strncpy para asegurarte de que estas dentro de los limites de la memoria asignada.

¡Saludos!

Si mira entiendo lo que planteas, pero fijate en el codigo, que inicializo el vector ejecutar llanandolo de '\0'.

Código
  1.  
  2. for(int i=0; i<40; i++)
  3.    {ejecutar[i]='\0';} //llenamos el vector de espacios en blanco, para no dejar basuras !!
  4.  
En línea

"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: [DUDA] añadir espacios al utilizar la función strcat
« Respuesta #19 en: 10 Agosto 2012, 16:22 pm »

Si mira entiendo lo que planteas, pero fijate en el codigo, que inicializo el vector ejecutar llanandolo de '\0'.

Código
  1.  
  2. for(int i=0; i<40; i++)
  3.    {ejecutar[i]='\0';} //llenamos el vector de espacios en blanco, para no dejar basuras !!
  4.  

Ups, no me habia dado cuenta...  :silbar:

De todas formas, si el proposito del vector es que funcione como cadena de caracteres, lo unico que tienes que hacer es asignar '\0' a la primera posicion. El resto son operaciones inutiles, ya que cualquier funcion de la libreria estandar de C considera el final de la cadena el primer caracter '\0', ignorando lo que venga despues. Por lo tanto estas haciendo 39 operaciones que no te sirven para nada.

Si el proposito del vector es otro, tendras que ver como inicializarlo para que contenga informacion consistente con respecto a las operaciones sucesivas.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO]-[ayuda] funcion cambiar linea al estilo space para dejar espacios
.NET (C#, VB.NET, ASP)
faralito 3 4,638 Último mensaje 29 Enero 2009, 16:02 pm
por faralito
Añadir la función buscar a mi web
Desarrollo Web
chocola 3 3,407 Último mensaje 23 Noviembre 2011, 05:11 am
por DarK_FirefoX
[Duda C] Como añadir variable a la función system() « 1 2 »
Programación C/C++
Dryken 10 9,085 Último mensaje 3 Julio 2012, 14:28 pm
por Dryken
Espacios en concatenación strcat. « 1 2 »
Programación C/C++
programator11 13 7,036 Último mensaje 7 Agosto 2014, 20:05 pm
por rir3760
¿Se puede añadir una funcion a string.h? « 1 2 »
Programación C/C++
mester 10 5,294 Último mensaje 25 Diciembre 2015, 01:55 am
por mester
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines