[C][Bug][SOLUCIONADO] Problema al con mi código de traducción.

Iniciado por sabeeee, 14 Enero 2015, 23:19 PM

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

sabeeee

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.
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

MeCraniDOS

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
"La física es el sistema operativo del Universo"
     -- Steven R Garman

sabeeee

#2
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.
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon