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
if (system("CLS")) system("clear");
/* 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): ");
scanf("%s",filename);
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");
scanf("%d" ,&clave);
EnterLimp();
clrScr();
// Modo clave 1
if( clave== 1 ){
Mensaje();
printf("\nLa clave de mas de 3 caracteres: ");
scanf("%s",cmb);
EnterLimp();
}
// Modo clave 2
if( clave== 2 ){
Mensaje();
printf("\nLa clave: ");
scanf("%s",cmb);
EnterLimp();
}
clrScr();
//Modo "oculto"
if( clave== 2 ){
Mensaje();
printf("No es posible modo oculto con clave externa\n");
printf("Enter para continuar\n");
getchar(); //pausa multiplataforma
}else{
Mensaje();
printf("Para modo oculto escriba 1 (solo windows) o 0 para normal : ");
scanf("%d" ,&oculto);
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");
getchar();
exit(1);
}
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");
fprintf(fp,"{\n");
if( clave== 1 ){
// modo clave
fprintf(fp,"\nchar clave[6];\n");
fprintf(fp,"printf(\"Escriba su clave: \");\n");
fprintf(fp,"scanf(\"%%s\",clave);\n");
fprintf(fp,"if(strcmp(clave,\"%s\")==0)\n",cmb);
fprintf(fp,"{\n");
}
if( clave== 2 ){
// modo consola
fprintf(fp,"\tchar clave[21];\n");
fprintf(fp,"\tchar clave2[21] = \"%s\";\n",cmb);
fprintf(fp,"\tif ( argc < 3 ) {\n");
fprintf(fp,"\tprintf(\"USO: programa -pass clave\");\n");
fprintf(fp,"\treturn 1;\n");
fprintf(fp,"}\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,"}\n");
fprintf(fp,"\telse\n");
fprintf(fp,"return 1;\n");
fprintf(fp,"\n");
fprintf(fp,"\tif ( !strcmp(clave, clave2) )\n");
fprintf(fp,"{\n");
}
clrScr();
Mensaje();
printf("\nComience a escribir los comandos : \n");
printf("Cuando finalice, ecriba 'FIN' para terminar\n");
printf("\nComandos :\n\n");
gets(cmd);
while (1)
{
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
while (!strcmp(cmd,"PAUSE\>NUL"))
{
fprintf(fp,"\tgetchar();\n");
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
}
while (!strcmp(cmd,"PAUSE"))
{
fprintf(fp,"\tprintf(\"Presione una tecla para continuar.\");\n");
fprintf(fp,"\tgetchar();\n");
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
}
if (!strcmp(cmd,"FIN"))
{
break; //if end is typed, get out of loop
}
fprintf(fp,"\tsystem(\"%s\");\n",cmd);
}
if( clave== 0 ){
fprintf(fp,"}");
}
if( clave== 1 ){
// modo clave
fprintf(fp,"\t}\nelse\n{\n");
fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
fprintf(fp,"\treturn 0;\n}");
}
if( clave== 2 ){
// modo clave
fprintf(fp,"\t}\nelse\n{\n");
fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
fprintf(fp,"\treturn 0;\n}");
}
fclose(fp);
}
getchar();
}
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: ");
scanf("%s",filename);
fp = fopen(filename,"w");
if (fp==NULL)
{
printf("Some error occurred while opening file");
getchar();
exit(1);
}
else
{
fprintf(fp,"%s",incs);
printf("\nIngrese sus codigos: \n");
gets(cmd);
while (1)
{
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
while (!strcmp(cmd,"PAUSE\>NUL"))
{
fprintf(fp,"\tgetchar();\n");
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
}
while (!strcmp(cmd,"PAUSE"))
{
fprintf(fp,"\tprintf(\"Presione una tecla para continuar.\");\n");
fprintf(fp,"\tgetchar();\n");
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
}
if (!strcmp(cmd,"FIN"))
{
break;
}
fprintf(fp,"\tsystem(\"%s\");\n",cmd);
}
fprintf(fp,"\n%s",end);
fclose(fp);
}
getchar();
}
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
if (system("CLS")) system("clear");
/* 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): ");
scanf("%s",filename);
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");
scanf("%d" ,&clave);
EnterLimp();
clrScr();
// Modo clave 1
if( clave== 1 ){
Mensaje();
printf("\nLa clave de mas de 3 caracteres: ");
scanf("%s",cmb);
EnterLimp();
clrScr();
}
// Modo clave 2
if( clave== 2 ){
Mensaje();
printf("\nLa clave: ");
scanf("%s",cmb);
EnterLimp();
clrScr();
//Modo "oculto"
Mensaje();
printf("No es posible modo oculto con clave externa\n");
printf("Enter para continuar\n");
getchar(); //pausa multiplataforma
}else{
Mensaje();
printf("Para modo oculto escriba 1 (solo windows) o 0 para normal : ");
scanf("%d" ,&oculto);
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");
getchar();
exit(1);
}
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");
fprintf(fp,"{\n");
if( clave== 1 ){
// modo clave
fprintf(fp,"\nchar clave[6];\n");
fprintf(fp,"printf(\"Escriba su clave: \");\n");
fprintf(fp,"scanf(\"%%s\",clave);\n");
fprintf(fp,"if(strcmp(clave,\"%s\")==0)\n",cmb);
fprintf(fp,"{\n");
}
if( clave== 2 ){
// modo consola
fprintf(fp,"\tchar clave[21];\n");
fprintf(fp,"\tchar clave2[21] = \"%s\";\n",cmb);
fprintf(fp,"\tif ( argc < 3 ) {\n");
fprintf(fp,"\tprintf(\"USO: programa -pass clave\");\n");
fprintf(fp,"\treturn 1;\n");
fprintf(fp,"}\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,"}\n");
fprintf(fp,"\telse\n");
fprintf(fp,"return 1;\n");
fprintf(fp,"\n");
fprintf(fp,"\tif ( !strcmp(clave, clave2) )\n");
fprintf(fp,"{\n");
}
clrScr();
Mensaje();
printf("\nComience a escribir los comandos : \n");
printf("Cuando finalice, ecriba 'FIN' para terminar\n");
printf("\nComandos :\n\n");
while (1)
{
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
while (!strcmp(cmd,"PAUSE\>NUL"))
{
fprintf(fp,"\tgetchar();\n");
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
}
while (!strcmp(cmd,"PAUSE"))
{
fprintf(fp,"\tprintf(\"Presione una tecla para continuar.\");\n");
fprintf(fp,"\tgetchar();\n");
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
}
if (!strcmp(cmd,"FIN"))
{
break; //if end is typed, get out of loop
}
fprintf(fp,"\tsystem(\"%s\");\n",cmd);
}
if( clave== 0 ){
fprintf(fp,"}");
}
if( clave== 1 ){
// modo clave
fprintf(fp,"\t}\nelse\n{\n");
fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
fprintf(fp,"\treturn 0;\n}");
}
if( clave== 2 ){
// modo clave
fprintf(fp,"\t}\nelse\n{\n");
fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
fprintf(fp,"\treturn 0;\n}");
}
fclose(fp);
}
getchar();
}
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.
Linea 68 y 77 haces la misma comprobación, ¿quizá ese es el error?
Como consejo deberías limpiar un poco el código, no he seguido mirando porque es un poco difícil de entender...
Un saludo
En la consola ingreso:
echo Prueba pause
PAUSE
echo Prueba pause>nul
PAUSE>NUL
FIN
Y da de resultado:
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char **argv)
{
//La primera linea ¿En donde esta? //MAL
printf("Presione una tecla para continuar."); //OK
getchar(); //OK
system("echo prueba pausenul"); //OK
getchar(); //OK
}
Gracias igualmente por corregir el código.
¿Sera porque use el gets con el scanf?
----------
EDIT: La solución era borrar la linea '163' que estaba allí por un despiste de novato que soy, yo pensando que era el bug que sucede al combinar gets con scanf, por algún lado había leído que se salteaba lineas y demás.