Autor
|
Tema: [DUDA] añadir espacios al utilizar la función strcat (Leído 16,636 veces)
|
Risketo
Desconectado
Mensajes: 37
|
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 el puerto:\t"); return 0; }
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
Mensajes: 3.158
I'Love...!¡.
|
. El realizar un strcat() en un buffer es para uno establecido dará POSIBLEMENTE un overflow de indices segun la lontitud de este... por ejemplo: #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 el puerto:\t"); }
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 // sustituimos todos los '\n' por ' ' while (res) { *res = ' '; } // puts(buffer); // solo para mostrar el comando... fflush(stdin ); // para que la siguiente instruccion no tenga problemas con el buffer de entrada la vació... return 0; }
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
Mensajes: 117
El arte de vencer se aprende en las derrotas
|
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.phpRisketo 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
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
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
Mensajes: 85
"Escucha el sonido del 0, 1"
|
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 !! if(strlen(ip )>=15) //comprobamos si se ha llegado al limite del vector y {return 1;} //retornamos 1 en caso contrario no retornamos nada {return 1;} strcat(ejecutar , " "); //concatenamos espacios a nuestro vector }
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
Mensajes: 3.158
I'Love...!¡.
|
@Fire544 No es recomendable usar scanf() de esa manera...
Dulces Lunas!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡Buenas! Tampoco deberias de empezar haciendo
, 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
Mensajes: 85
"Escucha el sonido del 0, 1"
|
BlackZeroX (Astaroth) Comprendo, tienes razon, luego se producirian errores logicos, pero mira esta seria una buena correccion !! 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
|
|
|
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
Mensajes: 85
"Escucha el sonido del 0, 1"
|
¡Buenas! Tampoco deberias de empezar haciendo
, 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 !!
|
|
|
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
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
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... 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!
|
|
|
|
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,902
|
29 Enero 2009, 16:02 pm
por faralito
|
|
|
Añadir la función buscar a mi web
Desarrollo Web
|
chocola
|
3
|
3,614
|
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,601
|
3 Julio 2012, 14:28 pm
por Dryken
|
|
|
Espacios en concatenación strcat.
« 1 2 »
Programación C/C++
|
programator11
|
13
|
7,611
|
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,865
|
25 Diciembre 2015, 01:55 am
por mester
|
|