[DUDA] añadir espacios al utilizar la función strcat

Iniciado por Dryken, 8 Agosto 2012, 17:23 PM

0 Miembros y 1 Visitante están viendo este tema.

Risketo

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


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
char puerto[25], ip[25];
char netcat[]="nc";


printf("Introduce la IP:\t");
scanf(" %s",&ip);
printf("Introduce el puerto:\t");
scanf(" %s",&puerto);

strcat(netcat," ");
strcat(netcat,ip);
strcat(netcat," ");
strcat(netcat,puerto);

system(netcat);
 
while(getchar() !='\n'); 
getchar();
return 0;

}


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

BlackZeroX

#11
.
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 (c,8) [Seleccionar]


#include <stdio.h>
#include <string.h>
#include <windows.h>

int main(){
char puerto[25], ip[25];
char netcat[]="nc"; // produce un error por que aquí solo hay una dimension de 3 indices... y se requiere una aun mas grande...

printf("Introduce la IP:\t");
scanf("%s",&ip);
printf("Introduce el puerto:\t");
scanf("%s",&puerto);
strcat(netcat,ip);
strcat(netcat,puerto);

system(netcat);
while(getchar() !='\n');  
getchar();

}



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...



#include <stdio.h>
#include <string.h>
#include <windows.h>

int main()
{
   char *res = NULL;
   const char COMANDO[] = "nc ";
   char puerto[25] = {},
        ip[25] = {},
        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'...

//    printf("%d\n", sizeof buffer); // oslo para saber cuanto buffer tenemos realmente...

   printf("Introduce la IP:\t"); fflush(stdout); // realizo un fflush debido a que en el printf() no termino con \n
   fgets(ip, sizeof puerto - 1, stdin); // con este -1 nos aseguramos que el ultimo byte sea SIEMPRE un \0

   printf("Introduce el puerto:\t"); fflush(stdout); // realizo un fflush debido a que en el printf() no termino con \n
   fgets(puerto, sizeof puerto - 1, stdin); // con este -1 nos aseguramos que el ultimo byte sea SIEMPRE un \0

   strcat(buffer, COMANDO);
   strcat(buffer, ip);
   strcat(buffer, puerto);

   //  sustituimos todos los '\n' por ' '
   res = strpbrk(buffer, "\n");
   while (res) {
       *res = ' ';
       res = strpbrk(res, "\n");
   }

//    puts(buffer); // solo para mostrar el comando...

   system(buffer);

   fflush(stdin); // para que la siguiente instruccion no tenga problemas con el buffer de entrada la vació...
   while(getchar() !='\n');

   return 0;
}



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

Yo me voy a jugar nos vemos.

Dulces Lunas!¡.
The Dark Shadow is my passion.

Dryken

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.
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

CitarMe 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
Ahorrate una pregunta, lee el man

Fire544

#14
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.


#include <stdio.h>
#include <string.h> //tenemos strcat();
#include <stdlib.h> //tenemos system()

int main()
{
   char telnet[7]="telnet", ejecutar[40], ip[15], puerto[5];
   
   for(int i=0; i<40; i++)
   {ejecutar[i]='\0';} //llenamos el vector de espacios en blanco, para no dejar basuras !!
   
   printf("IP Server: ");
   gets(ip);
   
    if(strlen(ip)>=15) //comprobamos si se ha llegado al limite del vector y
    {return 1;}         //retornamos 1 en caso contrario no retornamos nada
   
   printf("Puerto Server: ");
   gets(puerto);

   if(strlen(puerto)>=5)
    {return 1;}
   
   strcat(ejecutar, telnet);
   strcat(ejecutar, " "); //concatenamos espacios a nuestro vector
   strcat(ejecutar, ip);
   strcat(ejecutar, " ");
   strcat(ejecutar, puerto);
   
   system(ejecutar);
   
   getchar();
   }


Suerte !!  ;-)
"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

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

Dulces Lunas!¡.
The Dark Shadow is my passion.

do-while

¡Buenas!

Tampoco deberias de empezar haciendostrcat(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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Fire544

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


printf("Named Server: ");
    gets(ip);
   
    if(strlen(ip)>=15) //comprobamos que nuestro vector no este al limite de caracteres
    {return 1;} //tambien puedes devolver un mensaje avisando de la falta de espacio
"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

Cita de: do-while en 10 Agosto 2012, 14:31 PM
¡Buenas!

Tampoco deberias de empezar haciendostrcat(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'.



for(int i=0; i<40; i++)
    {ejecutar[i]='\0';} //llenamos el vector de espacios en blanco, para no dejar basuras !!
"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

Cita de: Fire544 en 10 Agosto 2012, 15:51 PM
Si mira entiendo lo que planteas, pero fijate en el codigo, que inicializo el vector ejecutar llanandolo de '\0'.



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


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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!