elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C][Bug][SOLUCIONADO] Problema al con mi código de traducción.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C][Bug][SOLUCIONADO] Problema al con mi código de traducción.  (Leído 1,653 veces)
sabeeee

Desconectado Desconectado

Mensajes: 155


Ver Perfil
[C][Bug][SOLUCIONADO] Problema al con mi código de traducción.
« en: 14 Enero 2015, 23:19 pm »

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:

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. // Limpiador de pantalla
  7. void clrScr()
  8. {
  9. //Windows/Linux
  10. if (system("CLS")) system("clear");
  11. /* Modo realmente multiplataforma (malo).
  12.     int n;
  13.     for (n = 0; n < 10; n++)
  14.     printf( "\n\n\n\n\n\n\n\n\n\n\n\n\n" );
  15. */
  16. }
  17.  
  18. // Mensaje "propagandistico"
  19. void Mensaje()
  20. {
  21. printf("\t+----------------------------+\n");
  22.    printf("\t|BATCH TO C SOURCE CONVERTER |\n");
  23.    printf("\t+----------------------------+\n");
  24. }
  25. // Limpiador de ENTER
  26. void EnterLimp()
  27. {
  28. while ( getchar() != '\n' );    /* limpia el caracter ENTER de la entrada estandar */
  29. }
  30.  
  31. int main()
  32. {
  33. int oculto;
  34. int clave;
  35.  
  36.    FILE *fp;
  37. char *cPtr;
  38.    char filename[30];          //filename for source code
  39.    //for command
  40.    char cmd[150];
  41.    //la clave
  42.    char cmb[350];
  43.  
  44. // Nombre archivo final
  45. Mensaje();
  46. printf("\nEntre el nombre que le quiere dar al codigo saliente(.c): ");
  47. scanf("%s",filename);
  48. EnterLimp();
  49.  
  50. clrScr();
  51.  
  52. // Tipo de clave
  53. Mensaje();
  54. printf("AVISO: (No es posible modo oculto con clave externa) (2)\n ");
  55. printf("1: Para modo clave consola.\n 2: para clave externa (-pass clave) \n 0: sin clave");
  56. scanf("%d" ,&clave);
  57. EnterLimp();
  58. clrScr();
  59.  
  60. // Modo clave 1
  61. if( clave== 1 ){
  62. Mensaje();
  63.    printf("\nLa clave de mas de 3 caracteres: ");
  64.    scanf("%s",cmb);
  65. EnterLimp();
  66. }
  67. // Modo clave 2
  68. if( clave== 2 ){
  69. Mensaje();
  70.    printf("\nLa clave: ");
  71.    scanf("%s",cmb);
  72. EnterLimp();
  73. }
  74. clrScr();
  75.  
  76. //Modo "oculto"
  77. if( clave== 2 ){
  78. Mensaje();
  79. printf("No es posible modo oculto con clave externa\n");
  80. printf("Enter para continuar\n");
  81. getchar(); //pausa multiplataforma
  82. }else{
  83. Mensaje();
  84. printf("Para modo oculto escriba 1 (solo windows) o 0 para normal : ");
  85. scanf("%d" ,&oculto);
  86. EnterLimp();
  87. }
  88. clrScr();
  89. /*
  90. //Concatenado
  91. Mensaje();
  92.     printf("\nMetodo de concatenado : ");
  93.     printf("\n1 para metodo modo inteligente (beta) : ");
  94.     scanf("%d",&concatenado);
  95. EnterLimp();
  96.  
  97. clrScr();
  98. */
  99. //Codigos
  100. fp = fopen(filename,"w");
  101.    if (fp==NULL)
  102.    {
  103.     printf("Ocurrio un error al intentar abrir el archivo");
  104.     getchar();
  105.     exit(1);
  106.    }
  107.    else
  108.    {
  109. // includes normales
  110. fprintf(fp,"#include <stdio.h>\n");
  111.        fprintf(fp,"#include <stdlib.h>\n");
  112. if( clave== 2 ){
  113. fprintf(fp,"#include <string.h>\n");
  114. }
  115. if( oculto== 1 ){
  116. // modo oculto
  117.        fprintf(fp,"#include <windows.h>\n");
  118. }
  119.  
  120. if( oculto== 1 ){
  121.        fprintf(fp,"int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\n");
  122.        fprintf(fp,"PSTR szCmdLine, int iCmdShow)\n");
  123. }
  124. // int argc, char **argv
  125. fprintf(fp,"int main( int argc, char **argv)\n");
  126.        fprintf(fp,"{\n");
  127.  
  128. if( clave== 1 ){
  129. // modo clave
  130.  
  131.        fprintf(fp,"\nchar clave[6];\n");
  132.        fprintf(fp,"printf(\"Escriba su clave: \");\n");
  133.        fprintf(fp,"scanf(\"%%s\",clave);\n");
  134.        fprintf(fp,"if(strcmp(clave,\"%s\")==0)\n",cmb);
  135.        fprintf(fp,"{\n");
  136. }
  137. if( clave== 2 ){
  138. // modo consola
  139.        fprintf(fp,"\tchar clave[21];\n");
  140.        fprintf(fp,"\tchar clave2[21] = \"%s\";\n",cmb);
  141.        fprintf(fp,"\tif ( argc < 3 ) {\n");
  142.        fprintf(fp,"\tprintf(\"USO: programa -pass clave\");\n");
  143.        fprintf(fp,"\treturn 1;\n");
  144.        fprintf(fp,"}\n");
  145.        fprintf(fp,"\tif ( !strcmp( argv[1], \"-pass\" ) ) {\n");
  146.        fprintf(fp,"\tstrncpy( clave, argv[2], 20 );\n");
  147.        fprintf(fp,"\tclave[21] = '\\0';\n");
  148.        fprintf(fp,"}\n");
  149.        fprintf(fp,"\telse\n");
  150.        fprintf(fp,"return 1;\n");
  151.        fprintf(fp,"\n");
  152.        fprintf(fp,"\tif ( !strcmp(clave, clave2) )\n");
  153.        fprintf(fp,"{\n");
  154. }
  155. clrScr();
  156.  
  157. Mensaje();
  158.  
  159.        printf("\nComience a escribir los comandos : \n");
  160.        printf("Cuando finalice, ecriba 'FIN' para terminar\n");
  161.        printf("\nComandos :\n\n");
  162.  
  163.        gets(cmd);
  164.        while (1)
  165.        {
  166.  
  167. fgets( cmd, 150, stdin );
  168. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  169.  
  170. while (!strcmp(cmd,"PAUSE\>NUL"))
  171. {
  172. fprintf(fp,"\tgetchar();\n");
  173. fgets( cmd, 150, stdin );
  174. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  175.                 }
  176.  
  177. while (!strcmp(cmd,"PAUSE"))
  178. {
  179. fprintf(fp,"\tprintf(\"Presione una tecla para continuar.\");\n");
  180. fprintf(fp,"\tgetchar();\n");
  181. fgets( cmd, 150, stdin );
  182. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  183.                 }
  184. if (!strcmp(cmd,"FIN"))
  185.                 {
  186.                 break;              //if end is typed, get out of loop
  187.                 }
  188.              fprintf(fp,"\tsystem(\"%s\");\n",cmd);
  189. }
  190. if( clave== 0 ){
  191.        fprintf(fp,"}");
  192. }
  193.  
  194. if( clave== 1 ){
  195. // modo clave
  196.        fprintf(fp,"\t}\nelse\n{\n");
  197.        fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
  198.        fprintf(fp,"\treturn 0;\n}");
  199. }
  200.  
  201. if( clave== 2 ){
  202. // modo clave
  203.        fprintf(fp,"\t}\nelse\n{\n");
  204.        fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
  205.        fprintf(fp,"\treturn 0;\n}");
  206. }
  207. fclose(fp);
  208.    }
  209. }


Código que funciona perfectamente y es similar:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. int main()
  6. {
  7. char *cPtr;
  8.  
  9.    FILE *fp;
  10.    char filename[30];
  11.    char incs[200] = "#include <stdio.h>\n#include <stdlib.h>\nint main()\n{\n";
  12.    char end[50] = "}\n";
  13.    char cmd[150];
  14.  
  15.    printf("\nArchivo a crear: ");
  16.    scanf("%s",filename);
  17.    fp = fopen(filename,"w");
  18.    if (fp==NULL)
  19.    {
  20.     printf("Some error occurred while opening file");
  21.     getchar();
  22.     exit(1);
  23.    }
  24.    else
  25.    {
  26.        fprintf(fp,"%s",incs);
  27.  
  28.        printf("\nIngrese sus codigos: \n");
  29.  
  30.        gets(cmd);
  31.        while (1)
  32.        {
  33. fgets( cmd, 150, stdin );
  34. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  35.  
  36. while (!strcmp(cmd,"PAUSE\>NUL"))
  37. {
  38. fprintf(fp,"\tgetchar();\n");
  39. fgets( cmd, 150, stdin );
  40. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  41.                 }
  42.  
  43. while (!strcmp(cmd,"PAUSE"))
  44. {
  45. fprintf(fp,"\tprintf(\"Presione una tecla para continuar.\");\n");
  46. fprintf(fp,"\tgetchar();\n");
  47. fgets( cmd, 150, stdin );
  48. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  49.                 }
  50. if (!strcmp(cmd,"FIN"))
  51.                 {
  52.                 break;
  53.                 }
  54.              fprintf(fp,"\tsystem(\"%s\");\n",cmd);
  55. }
  56.  
  57.        fprintf(fp,"\n%s",end);
  58.  
  59.        fclose(fp);
  60.    }
  61.    getchar();
  62. }

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.

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. // Limpiador de pantalla
  7. void clrScr()
  8. {
  9. //Windows/Linux
  10. if (system("CLS")) system("clear");
  11. /* Modo realmente multiplataforma (malo).
  12.     int n;
  13.     for (n = 0; n < 10; n++)
  14.     printf( "\n\n\n\n\n\n\n\n\n\n\n\n\n" );
  15. */
  16. }
  17.  
  18. // Mensaje "propagandistico"
  19. void Mensaje()
  20. {
  21. printf("\t+----------------------------+\n");
  22.    printf("\t|BATCH TO C SOURCE CONVERTER |\n");
  23.    printf("\t+----------------------------+\n");
  24. }
  25. // Limpiador de ENTER
  26. void EnterLimp()
  27. {
  28. while ( getchar() != '\n' );    /* limpia el caracter ENTER de la entrada estandar */
  29. }
  30.  
  31. int main()
  32. {
  33. int oculto;
  34. int clave;
  35.  
  36.    FILE *fp;
  37. char *cPtr;
  38.    char filename[30];          //filename for source code
  39.    //for command
  40.    char cmd[150];
  41.    //la clave
  42.    char cmb[350];
  43.  
  44. // Nombre archivo final
  45. Mensaje();
  46. printf("\nEntre el nombre que le quiere dar al codigo saliente(.c): ");
  47. scanf("%s",filename);
  48. EnterLimp();
  49.  
  50. clrScr();
  51.  
  52. // Tipo de clave
  53. Mensaje();
  54. printf("AVISO: (No es posible modo oculto con clave externa) (2)\n ");
  55. printf("1: Para modo clave consola.\n 2: para clave externa (-pass clave) \n 0: sin clave:\n\t");
  56. scanf("%d" ,&clave);
  57. EnterLimp();
  58. clrScr();
  59.  
  60. // Modo clave 1
  61. if( clave== 1 ){
  62. Mensaje();
  63.    printf("\nLa clave de mas de 3 caracteres: ");
  64.    scanf("%s",cmb);
  65. EnterLimp();
  66. clrScr();
  67. }
  68. // Modo clave 2
  69. if( clave== 2 ){
  70. Mensaje();
  71.    printf("\nLa clave: ");
  72.    scanf("%s",cmb);
  73. EnterLimp();
  74.  
  75. clrScr();
  76.  
  77. //Modo "oculto"
  78. Mensaje();
  79. printf("No es posible modo oculto con clave externa\n");
  80. printf("Enter para continuar\n");
  81. getchar(); //pausa multiplataforma
  82. }else{
  83. Mensaje();
  84. printf("Para modo oculto escriba 1 (solo windows) o 0 para normal : ");
  85. scanf("%d" ,&oculto);
  86. EnterLimp();
  87. }
  88. clrScr();
  89. /*
  90. //Concatenado
  91. Mensaje();
  92.     printf("\nMetodo de concatenado : ");
  93.     printf("\n1 para metodo modo inteligente (beta) : ");
  94.     scanf("%d",&concatenado);
  95. EnterLimp();
  96.  
  97. clrScr();
  98. */
  99. //Codigos
  100. fp = fopen(filename,"w");
  101.    if (fp==NULL)
  102.    {
  103.     printf("Ocurrio un error al intentar abrir el archivo");
  104.     getchar();
  105.     exit(1);
  106.    }
  107.    else
  108.    {
  109. // includes normales
  110. fprintf(fp,"#include <stdio.h>\n");
  111.        fprintf(fp,"#include <stdlib.h>\n");
  112. if( clave== 2 ){
  113. fprintf(fp,"#include <string.h>\n");
  114. }
  115. if( oculto== 1 ){
  116. // modo oculto
  117.        fprintf(fp,"#include <windows.h>\n");
  118. }
  119.  
  120. if( oculto== 1 ){
  121.        fprintf(fp,"int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\n");
  122.        fprintf(fp,"PSTR szCmdLine, int iCmdShow)\n");
  123. }
  124. // int argc, char **argv
  125. fprintf(fp,"int main( int argc, char **argv)\n");
  126.        fprintf(fp,"{\n");
  127.  
  128. if( clave== 1 ){
  129. // modo clave
  130.  
  131.        fprintf(fp,"\nchar clave[6];\n");
  132.        fprintf(fp,"printf(\"Escriba su clave: \");\n");
  133.        fprintf(fp,"scanf(\"%%s\",clave);\n");
  134.        fprintf(fp,"if(strcmp(clave,\"%s\")==0)\n",cmb);
  135.        fprintf(fp,"{\n");
  136. }
  137. if( clave== 2 ){
  138. // modo consola
  139.        fprintf(fp,"\tchar clave[21];\n");
  140.        fprintf(fp,"\tchar clave2[21] = \"%s\";\n",cmb);
  141.        fprintf(fp,"\tif ( argc < 3 ) {\n");
  142.        fprintf(fp,"\tprintf(\"USO: programa -pass clave\");\n");
  143.        fprintf(fp,"\treturn 1;\n");
  144.        fprintf(fp,"}\n");
  145.        fprintf(fp,"\tif ( !strcmp( argv[1], \"-pass\" ) ) {\n");
  146.        fprintf(fp,"\tstrncpy( clave, argv[2], 20 );\n");
  147.        fprintf(fp,"\tclave[21] = '\\0';\n");
  148.        fprintf(fp,"}\n");
  149.        fprintf(fp,"\telse\n");
  150.        fprintf(fp,"return 1;\n");
  151.        fprintf(fp,"\n");
  152.        fprintf(fp,"\tif ( !strcmp(clave, clave2) )\n");
  153.        fprintf(fp,"{\n");
  154. }
  155. clrScr();
  156.  
  157. Mensaje();
  158.  
  159.        printf("\nComience a escribir los comandos : \n");
  160.        printf("Cuando finalice, ecriba 'FIN' para terminar\n");
  161.        printf("\nComandos :\n\n");
  162.  
  163.        while (1)
  164.        {
  165. fgets( cmd, 150, stdin );
  166. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  167.  
  168. while (!strcmp(cmd,"PAUSE\>NUL"))
  169. {
  170. fprintf(fp,"\tgetchar();\n");
  171. fgets( cmd, 150, stdin );
  172. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  173.                 }
  174.  
  175. while (!strcmp(cmd,"PAUSE"))
  176. {
  177. fprintf(fp,"\tprintf(\"Presione una tecla para continuar.\");\n");
  178. fprintf(fp,"\tgetchar();\n");
  179. fgets( cmd, 150, stdin );
  180. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  181.                 }
  182. if (!strcmp(cmd,"FIN"))
  183.                 {
  184.                 break;              //if end is typed, get out of loop
  185.                 }
  186.              fprintf(fp,"\tsystem(\"%s\");\n",cmd);
  187. }
  188. if( clave== 0 ){
  189.        fprintf(fp,"}");
  190. }
  191.  
  192. if( clave== 1 ){
  193. // modo clave
  194.        fprintf(fp,"\t}\nelse\n{\n");
  195.        fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
  196.        fprintf(fp,"\treturn 0;\n}");
  197. }
  198.  
  199. if( clave== 2 ){
  200. // modo clave
  201.        fprintf(fp,"\t}\nelse\n{\n");
  202.        fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
  203.        fprintf(fp,"\treturn 0;\n}");
  204. }
  205. fclose(fp);
  206.    }
  207. }

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.


« Última modificación: 15 Enero 2015, 18:09 pm por sabeeee » En línea

"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon
MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [C][Bug] Problema al con mi código de traducción.
« Respuesta #1 en: 15 Enero 2015, 13:30 pm »

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 línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
sabeeee

Desconectado Desconectado

Mensajes: 155


Ver Perfil
Re: [C][Bug] Problema al con mi código de traducción.
« Respuesta #2 en: 15 Enero 2015, 17:55 pm »

En la consola ingreso:
Código:
echo Prueba pause
PAUSE
echo Prueba pause>nul
PAUSE>NUL
FIN

Y da de resultado:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main( int argc, char **argv)
  4. {
  5.        //La primera linea ¿En donde esta? //MAL
  6. printf("Presione una tecla para continuar."); //OK
  7. getchar(); //OK
  8. system("echo prueba pausenul"); //OK
  9. getchar(); //OK
  10. }

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.
« Última modificación: 15 Enero 2015, 18:18 pm por sabeeee » En línea

"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
traduccion de codigo visual basic 2008 a visual c++ 2008?
.NET (C#, VB.NET, ASP)
Nichas 0 4,142 Último mensaje 22 Noviembre 2008, 17:49 pm
por Nichas
Traducción de código en C a IA32
ASM
Qorin 1 4,584 Último mensaje 21 Diciembre 2010, 18:48 pm
por Yurix
Extrayendo código fuente de una web (Problema con código generado por JS)
PHP
Littl3 4 7,843 Último mensaje 3 Marzo 2011, 04:13 am
por Nakp
Traduccion de codigo delphi a VB6
Programación Visual Basic
revenge1252 3 2,207 Último mensaje 16 Julio 2012, 03:01 am
por Yoghurt
problema con traduccion de tema de wordpress WPML
Desarrollo Web
basickdagger 1 1,663 Último mensaje 21 Agosto 2014, 00:46 am
por basickdagger
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines