Hola nuevamente foro, tengo un problema que me dificulta seguir con mi código, digo que es un bug porque hice mi código aparte, el cual funciona perfectamente, luego lo implemente a mi código y falla:
Código donde se presenta la falla:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
// Limpiador de pantalla
void clrScr()
{
//Windows/Linux
/* Modo realmente multiplataforma (malo).
int n;
for (n = 0; n < 10; n++)
printf( "\n\n\n\n\n\n\n\n\n\n\n\n\n" );
*/
}
// Mensaje "propagandistico"
void Mensaje()
{
printf("\t+----------------------------+\n"); printf("\t|BATCH TO C SOURCE CONVERTER |\n"); printf("\t+----------------------------+\n"); }
// Limpiador de ENTER
void EnterLimp()
{
while ( getchar() != '\n' ); /* limpia el caracter ENTER de la entrada estandar */ }
int main()
{
int oculto;
int clave;
FILE *fp;
char *cPtr;
char filename[30]; //filename for source code
//for command
char cmd[150];
//la clave
char cmb[350];
// Nombre archivo final
Mensaje();
printf("\nEntre el nombre que le quiere dar al codigo saliente(.c): "); EnterLimp();
clrScr();
// Tipo de clave
Mensaje();
printf("AVISO: (No es posible modo oculto con clave externa) (2)\n "); printf("1: Para modo clave consola.\n 2: para clave externa (-pass clave) \n 0: sin clave"); EnterLimp();
clrScr();
// Modo clave 1
if( clave== 1 ){
Mensaje();
printf("\nLa clave de mas de 3 caracteres: "); EnterLimp();
}
// Modo clave 2
if( clave== 2 ){
Mensaje();
EnterLimp();
}
clrScr();
//Modo "oculto"
if( clave== 2 ){
Mensaje();
printf("No es posible modo oculto con clave externa\n"); printf("Enter para continuar\n"); }else{
Mensaje();
printf("Para modo oculto escriba 1 (solo windows) o 0 para normal : "); EnterLimp();
}
clrScr();
/*
//Concatenado
Mensaje();
printf("\nMetodo de concatenado : ");
printf("\n1 para metodo modo inteligente (beta) : ");
scanf("%d",&concatenado);
EnterLimp();
clrScr();
*/
//Codigos
fp
= fopen(filename
,"w"); if (fp==NULL)
{
printf("Ocurrio un error al intentar abrir el archivo"); }
else
{
// includes normales
fprintf(fp
,"#include <stdio.h>\n"); fprintf(fp
,"#include <stdlib.h>\n"); if( clave== 2 ){
fprintf(fp
,"#include <string.h>\n"); }
if( oculto== 1 ){
// modo oculto
fprintf(fp
,"#include <windows.h>\n"); }
if( oculto== 1 ){
fprintf(fp
,"int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\n"); fprintf(fp
,"PSTR szCmdLine, int iCmdShow)\n"); }
// int argc, char **argv
fprintf(fp
,"int main( int argc, char **argv)\n");
if( clave== 1 ){
// modo clave
fprintf(fp
,"printf(\"Escriba su clave: \");\n"); fprintf(fp
,"scanf(\"%%s\",clave);\n"); fprintf(fp
,"if(strcmp(clave,\"%s\")==0)\n",cmb
); }
if( clave== 2 ){
// modo consola
fprintf(fp
,"\tchar clave2[21] = \"%s\";\n",cmb
); fprintf(fp
,"\tif ( argc < 3 ) {\n"); fprintf(fp
,"\tprintf(\"USO: programa -pass clave\");\n"); fprintf(fp
,"\tif ( !strcmp( argv[1], \"-pass\" ) ) {\n"); fprintf(fp
,"\tstrncpy( clave, argv[2], 20 );\n"); fprintf(fp
,"\tclave[21] = '\\0';\n"); fprintf(fp
,"\tif ( !strcmp(clave, clave2) )\n"); }
clrScr();
Mensaje();
printf("\nComience a escribir los comandos : \n"); printf("Cuando finalice, ecriba 'FIN' para terminar\n");
while (1)
{
fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0';
while (!strcmp(cmd
,"PAUSE\>NUL")) {
fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0'; }
{
fprintf(fp
,"\tprintf(\"Presione una tecla para continuar.\");\n"); fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0'; }
{
break; //if end is typed, get out of loop
}
fprintf(fp
,"\tsystem(\"%s\");\n",cmd
); }
if( clave== 0 ){
}
if( clave== 1 ){
// modo clave
fprintf(fp
,"\tprintf(\"Clave no valida\");\n}\n"); }
if( clave== 2 ){
// modo clave
fprintf(fp
,"\tprintf(\"Clave no valida\");\n}\n"); }
}
}
Código que funciona perfectamente y es similar:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main()
{
char *cPtr;
FILE *fp;
char filename[30];
char incs[200] = "#include <stdio.h>\n#include <stdlib.h>\nint main()\n{\n";
char end[50] = "}\n";
char cmd[150];
printf("\nArchivo a crear: "); fp
= fopen(filename
,"w"); if (fp==NULL)
{
printf("Some error occurred while opening file"); }
else
{
printf("\nIngrese sus codigos: \n");
while (1)
{
fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0';
while (!strcmp(cmd
,"PAUSE\>NUL")) {
fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0'; }
{
fprintf(fp
,"\tprintf(\"Presione una tecla para continuar.\");\n"); fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0'; }
{
break;
}
fprintf(fp
,"\tsystem(\"%s\");\n",cmd
); }
}
}
Lo que pasa es que en el ultimo me devuelve el código perfectamente y el primero de todos, ese es el que falla y no se porque, funciona pero se saltea las lineas, aveces anda otras no ¿Se le puede hacer algo?.
SOLUCIONADO Y CORREGIDO UN POCO.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
// Limpiador de pantalla
void clrScr()
{
//Windows/Linux
/* Modo realmente multiplataforma (malo).
int n;
for (n = 0; n < 10; n++)
printf( "\n\n\n\n\n\n\n\n\n\n\n\n\n" );
*/
}
// Mensaje "propagandistico"
void Mensaje()
{
printf("\t+----------------------------+\n"); printf("\t|BATCH TO C SOURCE CONVERTER |\n"); printf("\t+----------------------------+\n"); }
// Limpiador de ENTER
void EnterLimp()
{
while ( getchar() != '\n' ); /* limpia el caracter ENTER de la entrada estandar */ }
int main()
{
int oculto;
int clave;
FILE *fp;
char *cPtr;
char filename[30]; //filename for source code
//for command
char cmd[150];
//la clave
char cmb[350];
// Nombre archivo final
Mensaje();
printf("\nEntre el nombre que le quiere dar al codigo saliente(.c): "); EnterLimp();
clrScr();
// Tipo de clave
Mensaje();
printf("AVISO: (No es posible modo oculto con clave externa) (2)\n "); printf("1: Para modo clave consola.\n 2: para clave externa (-pass clave) \n 0: sin clave:\n\t"); EnterLimp();
clrScr();
// Modo clave 1
if( clave== 1 ){
Mensaje();
printf("\nLa clave de mas de 3 caracteres: "); EnterLimp();
clrScr();
}
// Modo clave 2
if( clave== 2 ){
Mensaje();
EnterLimp();
clrScr();
//Modo "oculto"
Mensaje();
printf("No es posible modo oculto con clave externa\n"); printf("Enter para continuar\n"); }else{
Mensaje();
printf("Para modo oculto escriba 1 (solo windows) o 0 para normal : "); EnterLimp();
}
clrScr();
/*
//Concatenado
Mensaje();
printf("\nMetodo de concatenado : ");
printf("\n1 para metodo modo inteligente (beta) : ");
scanf("%d",&concatenado);
EnterLimp();
clrScr();
*/
//Codigos
fp
= fopen(filename
,"w"); if (fp==NULL)
{
printf("Ocurrio un error al intentar abrir el archivo"); }
else
{
// includes normales
fprintf(fp
,"#include <stdio.h>\n"); fprintf(fp
,"#include <stdlib.h>\n"); if( clave== 2 ){
fprintf(fp
,"#include <string.h>\n"); }
if( oculto== 1 ){
// modo oculto
fprintf(fp
,"#include <windows.h>\n"); }
if( oculto== 1 ){
fprintf(fp
,"int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\n"); fprintf(fp
,"PSTR szCmdLine, int iCmdShow)\n"); }
// int argc, char **argv
fprintf(fp
,"int main( int argc, char **argv)\n");
if( clave== 1 ){
// modo clave
fprintf(fp
,"printf(\"Escriba su clave: \");\n"); fprintf(fp
,"scanf(\"%%s\",clave);\n"); fprintf(fp
,"if(strcmp(clave,\"%s\")==0)\n",cmb
); }
if( clave== 2 ){
// modo consola
fprintf(fp
,"\tchar clave2[21] = \"%s\";\n",cmb
); fprintf(fp
,"\tif ( argc < 3 ) {\n"); fprintf(fp
,"\tprintf(\"USO: programa -pass clave\");\n"); fprintf(fp
,"\tif ( !strcmp( argv[1], \"-pass\" ) ) {\n"); fprintf(fp
,"\tstrncpy( clave, argv[2], 20 );\n"); fprintf(fp
,"\tclave[21] = '\\0';\n"); fprintf(fp
,"\tif ( !strcmp(clave, clave2) )\n"); }
clrScr();
Mensaje();
printf("\nComience a escribir los comandos : \n"); printf("Cuando finalice, ecriba 'FIN' para terminar\n");
while (1)
{
fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0';
while (!strcmp(cmd
,"PAUSE\>NUL")) {
fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0'; }
{
fprintf(fp
,"\tprintf(\"Presione una tecla para continuar.\");\n"); fgets( cmd
, 150, stdin
); if ( ( cPtr
= strchr( cmd
, '\n' ) ) != NULL
) *cPtr
= '\0'; }
{
break; //if end is typed, get out of loop
}
fprintf(fp
,"\tsystem(\"%s\");\n",cmd
); }
if( clave== 0 ){
}
if( clave== 1 ){
// modo clave
fprintf(fp
,"\tprintf(\"Clave no valida\");\n}\n"); }
if( clave== 2 ){
// modo clave
fprintf(fp
,"\tprintf(\"Clave no valida\");\n}\n"); }
}
}
El error era muy básico, había utilizado un gets en donde no tenia que estar antes del bucle, lo elimine y el problema esta resuelto.