[Ayuda] variable dentro de char (solucionado)

Iniciado por sabeeee, 24 Diciembre 2014, 00:37 AM

0 Miembros y 2 Visitantes están viendo este tema.

sabeeee

Esta probando, ya que hace poco aprendí a dominar el batch bastante bien (te debes estar riendo), modificar, entender un poco el lenguaje C/C++ y me resulto excelente, cada paso que daba me daban mas ganas de aprenderlo, una especie de retroalimentacion positiva, y bueno voy por lo basico ahora, editar un "source" que tenia por alli de ejemplo y la verdad que me quede en:

   char header[300] = ("\nCodigo creado por %d\n", creador);

no logro entender que es lo que hice mal que cuando lo compilo con g++, da error, si me dicen que es lo que hice mal me dan una gran ayuda que espero que me ayude en el futuro

Tengo entendido que d es para numero pero es solo para ejemplo

/*********************************************
* Batch DOS To C Source Code Converter v.1.1 *
* Coded by Samar Dhwoj Acharya aka $yph3r$am *
* Website => http://sampctricks.blogspot.com *
* E-mail meh at samar_acharya[at]hotmail.com *
* Contact meh at +9779841150346 (NTC <a href="http://cityadspix.com/tsclick-MIQCWPUV-GECAQBFF?url=http%3A%2F%2Fwww.sotmarket.ru%2Fproduct%2Fsandisk-microsdxc-64gb-class-10-ultra-sd-adapter.html&sa=mh&sa1=&sa2=&sa3=&sa4=&sa5=&bt=20&pt=9&lt=2&tl=3&im=ODI1LTAtMTQxOTM3ODQyMC0xNzQ0OTE1Ng%3D%3D&fid=NDQ1NzU2Nzc1&prdct=0a3e083f0a3b0a3d0a&kw=mobile)%20*%0A*%20I" target="_blank" alt="Mobile Ultra microSDXC UHS-I 64GB" title="Mobile Ultra microSDXC UHS-I 64GB" style="">mobile) *
* I</a> know to code: PHP, PERL, C, JAVA, PYTHON, ASM *
*********************************************/
/*
Some Notes:
    -The program was created in real hurry in between end term exams
    -So the program lacks all buffer overflow protections and optimization form
    -The code can be modified but please don't change the credits for the file
    -If you come up with better idea of implementing it in C, please contact me
    -If you feel program is complete crap, do comment me personally or here
    -If you loved my coding, I feel really glad for that.
    -If you need to understand the coding(in fact, its just easy), contact me..
    - Visit my site http://www.sampctricks.blogspot.com and my group site http://www.nepsecvulns.blogspot.com
*/

//include header files...
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(){
  int creador;

   FILE *fp;
   char filename[30];          //filename for source code

   // starting header of outputted file
   char header[300] = ("\nCodigo creado por %d\n", creador);
   
   //all the includes in output file
   char incs[200] = "#include <stdio.h>\n#include <conio.h>\n#include <stdlib.h>\n#include <windows.h>\nint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\nPSTR szCmdLine, int iCmdShow)\n{\n";
   
   //end part of output file
   char end[50] = "\treturn 0;\n}";
   
   //for command
   char cmd[150];
   
   
   printf("\t+----------------------------+\n");
   printf("\t|BATCH TO C SOURCE CONVERTER |\n");
   printf("\t|CODED BY SAMARDHWOJ ACHARYA |\n");
   printf("\t+----------------------------+\n");
   
     printf("Introduce el nombre del creador ");
     scanf("%d", &creador);

   printf("\nEnter the filename(with .c extension): ");
   scanf("%s",filename);

   fp = fopen(filename,"w");
   if (fp==NULL)
   {
    printf("Some error occurred while opening file");
    getch();
    exit(1);
   }
   else
   {
       fprintf(fp,"%s%s",header,incs);
       
       printf("\nNow start entering DOS commands: \n");
       printf("When finished, type 'end' for the end of commands\n");

       printf("\nStart:\n\n");
       
       gets(cmd);
       while (1)
       {
             gets(cmd);
             if (!strcmp(cmd,"end"))
                {
                break;              //if end is typed, get out of loop
                }
             fprintf(fp,"\tsystem(\"%s\");\n",cmd);
       }
       fprintf(fp,"\tprintf(\"\\n\");");
       
       fprintf(fp,"\n%s",end);
       
       printf("\n\nFile successfully created");
       printf("\nNow compile it with any C compiler");
       printf("\nThanks for using this little app");
       fclose(fp);
   }
   getch();
}      



EDITO:
CODIGO SOLUCIONADO, No a la perfección pero resuelto, gracias mod y a Yoel que ya me pongo a implementar tu código.

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main()
{
    FILE *fp;
    char filename[30];          //filename for source code

    // starting header of outputted file
    char header[300] = "/*\nBatch DOS command To C source Converter\nBy sam207 (samar_acharya[at]hotmail.com)\nhttp://www.sampctricks.blogspot.com\nhttp://nepali.netau.net\n*/\n";
   
    //all the includes in output file
    char incs[200] = "#include <stdio.h>\n#include <conio.h>\n#include <stdlib.h>\n#include <windows.h>\nint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\nPSTR szCmdLine, int iCmdShow)\n{\n";

    //end part of output file
    char end[50] = "\treturn 0;\n}";
   
    //for command
    char cmd[150];

    //para el resto, la clave
    char cmb[350];

    printf("\t+----------------------------+\n");
    printf("\t|BATCH TO C SOURCE CONVERTER |\n");
    printf("\t|CODED BY SAMARDHWOJ ACHARYA |\n");
    printf("\t+----------------------------+\n");
   
    printf("\nEnter the filename(with .c extension): ");
    scanf("%s",filename);

    printf("\nContraseña: ");
    scanf("%s",cmb);
   
    fp = fopen(filename,"w");
    if (fp==NULL)
    {
     printf("Some error occurred while opening file");
     getch();
     exit(1);
    }
    else
    {
        fprintf(fp,"%s%s",header,incs);
        fprintf(fp,"char 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");

        printf("\nNow start entering DOS commands: \n");
        printf("When finished, type 'end' for the end of commands\n");

        printf("\nStart:\n\n");
       
        gets(cmd);
        while (1)
        {
              gets(cmd);
              if (!strcmp(cmd,"end"))
                 {
                 break;              //if end is typed, get out of loop
                 }
              fprintf(fp,"\tsystem(\"%s\");\n",cmd);

        }
        fprintf(fp,"\tprintf(\"\\n\");\n");
        fprintf(fp,"\t}\nelse\n{\n");
        fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");

        fprintf(fp,"\n%s",end);
       
        printf("\n\nFile successfully created");
        printf("\nNow compile it with any C compiler");
        printf("\nThanks for using this little app");
        fclose(fp);
    }
    getch();
}     


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

ivancea96

Citar("\nCodigo creado por %d\n", creador)

Eso es una función, (printf y compañía).
Si quieres inicializar el arreglo de char, puedes hacerlo así:
char var[50] = "123456789";

En caso de que quieras concatenarle un número, pues tendrás que, en primer lugar, convertir ese número a una cadena de char. Luego, concatenarlo.

itoa para convertir de int a char: http://www.cplusplus.com/reference/cstdlib/itoa/
strcat para concatenar dos cadenas: http://www.cplusplus.com/reference/cstring/strcat/

(También puedes hacer ambas funciones a mano, pero no creo que sea lo que quieres)

sabeeee

#2
Cita de: ivancea96 en 24 Diciembre 2014, 01:10 AM
Eso es una función, (printf y compañía).
Si quieres inicializar el arreglo de char, puedes hacerlo así:
char var[50] = "123456789";

En caso de que quieras concatenarle un número, pues tendrás que, en primer lugar, convertir ese número a una cadena de char. Luego, concatenarlo.

itoa para convertir de int a char: http://www.cplusplus.com/reference/cstdlib/itoa/
strcat para concatenar dos cadenas: http://www.cplusplus.com/reference/cstring/strcat/

(También puedes hacer ambas funciones a mano, pero no creo que sea lo que quieres)

ajaj la verdad que no entiendo nada.
bueno, a compilar y probar ejemplos que son esos numeritos?
-----
Edito:
Gracias!!! funciono solo el primero y apenas
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

ivancea96

#3
Las cadenas en C pueden ser confusas al principio. Dale tiempo xD

Yoel Alejandro

#4
Amigo sabeeee,

Luce interesante este ejemplo que has escogido para practicar, usa la función system() para "convertir" un script de comandos de DOS en un código fuente compilable de c. ¿Sabes que system() lo que hace es recurrir al procesador de comandos del sistema operadivo para evaluar una orden de comandos determinada? Por ejemplo, system("dir") ejecuta la orden de MSDOS "dir", la cual muestra el directorio actual, en Windows. Tambièn me doy cuenta por el "header" que genera en el archivo .c producido que es específico para Windows.

Mis observaciones. En primer lugar, "creador" es un string o cadena de caracteres. Debe ser declarado como tal:

char creador[51];

¿por qué 51? Pues, 50 caracteres más el carácter nulo de terminación de la cadena que se debe incluir. Luego, una forma de concatenar la cadena header + la cadena literal "Codigo creado por " + la cadena creador, puede ser:

sprintf( header, "\nCodigo creado por %s\n", creador);


Finalment un pequeño detalle que quizá no conocías del comportamiento de la función scanf( str ). Esta función lee una cadena de la entrada estándar (teclado) y la copia en la cadena argumento str. Por ejemplo:

scanf("%s", creador);

lee de la entrada estándar y copia el valor leído en la cadena creador. El detalle es que el carácter ENTER con que finalizar la cadena NO es copiado a creador, pero SÍ permanece en el "búfer" de entrada del teclado. Debes limpiar este carácter con la sentencia:

while ( getchar() != '\n' ) /* limpia el caracter ENTER de la entrada estandar */
     ;

(no olvides el punto y coma al final). Si no lo haces, entonces dicho carácter será leído con la siguiente llamada de scanf(), dando como resultado que se lea una cadena nula la próxima vex, lo que no queremos que ocurra.

Finalmente el código con las modificaciones, y por cierto que no es necesariamente para g++, también puede ser compilado con gcc puesto que está escrito en C, no en C++.

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main() {

  FILE *fp;
  char filename[31];          //filename for source code
  char creador[51];       /* <-- cadena para contener el nombre del creador */

  // starting header of outputted file
  char header[300];

  //all the includes in output file
  char incs[200] = "#include <stdio.h>\n#include <conio.h>\n#include <stdlib.h>\n#include <windows.h>\nint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\nPSTR szCmdLine, int iCmdShow)\n{\n\n";

  //end part of output file
  char end[50] = "\treturn 0;\n}";

  //for command
  char cmd[150];

  printf("\t+----------------------------+\n");
  printf("\t|BATCH TO C SOURCE CONVERTER |\n");
  printf("\t|CODED BY SAMARDHWOJ ACHARYA |\n");
  printf("\t+----------------------------+\n");

  printf("Introduce el nombre del creador: ");
  scanf("%s", creador);
  while ( getchar() != '\n' ) /* limpia el caracter ENTER de la entrada estandar */
     ;

  /* revisa aqui */
  sprintf( header, "\nCodigo creado por %s\n", creador);

  printf("\nEnter the filename(with .c extension): ");
  scanf("%s",filename);
  while ( getchar() != '\n' )    /* limpia el caracter ENTER de la entrada estandar */
     ;

  fp = fopen(filename,"w");
  if (fp==NULL)
  {
     printf("Some error occurred while opening file");
     getchar();
     exit(1);
  }
  else
  {
     fprintf(fp,"%s%s",header,incs);

     printf("\nNow start entering DOS commands: \n");
     printf("When finished, type 'end' for the end of commands\n");

     printf("\nStart:\n\n");

     gets( cmd );

     while ( strcmp( cmd, "end" ) )
     {
        fprintf(fp,"\tsystem(\"%s\");\n",cmd);
        gets(cmd );
     }
     fprintf(fp,"\tprintf(\"\\n\");");

     fprintf(fp,"\n%s",end);

     printf("\n\nFile successfully created");
     printf("\nNow compile it with any C compiler");
     printf("\nThanks for using this little app");
     fclose(fp);
  }
  getchar();
}
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

sabeeee

#5
Yo habia hecho esto  :-X, basicamente oculta la consola y pide contraseña, estaba haciéndolo, esta a medias, ahora el resto no es lo que importa, simplemente ahora el problema es que no puedo escribir %s, %d, etc lo que sea en el fprintf porque sale la clave escrita y no el %s o %d:

Código (cpp) [Seleccionar]
/*********************************************
* Batch DOS To C Source Code Converter v.1.1 *
* Coded by Samar Dhwoj Acharya aka $yph3r$am *
* Website => http://sampctricks.blogspot.com *
* E-mail meh at samar_acharya[at]hotmail.com *
* Contact meh at +9779841150346 (NTC mobile) *
* I know to code: PHP, PERL, C, JAVA, PYTHON, ASM *
*********************************************/
/*
Some Notes:
    -The program was created in real hurry in between end term exams
    -So the program lacks all buffer overflow protections and optimization form
    -The code can be modified but please don't change the credits for the file
    -If you come up with better idea of implementing it in C, please contact me
    -If you feel program is complete crap, do comment me personally or here
    -If you loved my coding, I feel really glad for that.
    -If you need to understand the coding(in fact, its just easy), contact me..
    - Visit my site http://www.sampctricks.blogspot.com and my group site http://www.nepsecvulns.blogspot.com
*/

//include header files...
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main()
{
   FILE *fp;
   char filename[30];          //filename for source code

   // starting header of outputted file
   char header[300] = "/*\nBatch DOS command To C source Converter\nBy sam207 (samar_acharya[at]hotmail.com)\nhttp://www.sampctricks.blogspot.com\nhttp://nepali.netau.net\n*/\n";
   
   //all the includes in output file
   char incs[200] = "#include <stdio.h>\n#include <conio.h>\n#include <stdlib.h>\n#include <windows.h>\nint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\nPSTR szCmdLine, int iCmdShow)\n{\n";

   //end part of output file
   char end[50] = "\treturn 0;\n}";
   
   //for command
   char cmd[150];

   //para el resto, la clave
   char cmb[350];

   printf("\t+----------------------------+\n");
   printf("\t|BATCH TO C SOURCE CONVERTER |\n");
   printf("\t|CODED BY SAMARDHWOJ ACHARYA |\n");
   printf("\t+----------------------------+\n");
   
   printf("\nEnter the filename(with .c extension): ");
   scanf("%s",filename);

   printf("\nContraseña: ");
   scanf("%s",cmb);
   
   fp = fopen(filename,"w");
   if (fp==NULL)
   {
    printf("Some error occurred while opening file");
    getch();
    exit(1);
   }
   else
   {
       fprintf(fp,"%s%s",header,incs);
fprintf(fp,"int pass;\n",cmb);
fprintf(fp,"printf(\"dame la clave: \");\n",cmb);
fprintf(fp,"scanf(\"%s\" ,&pass);\n",cmb);
fprintf(fp,"if( pass== %s ){\n",cmb);

       printf("\nNow start entering DOS commands: \n");
       printf("When finished, type 'end' for the end of commands\n");

       printf("\nStart:\n\n");
       
       gets(cmd);
       while (1)
       {
             gets(cmd);
             if (!strcmp(cmd,"end"))
                {
                break;              //if end is typed, get out of loop
                }
             fprintf(fp,"\tsystem(\"%s\");\n",cmd);

       }
       fprintf(fp,"\tprintf(\"\\n\");\n");
       fprintf(fp,"\t}else\n");
       fprintf(fp,"\tprintf(\"Clave no valida\");");

       fprintf(fp,"\n%s",end);
       
       printf("\n\nFile successfully created");
       printf("\nNow compile it with any C compiler");
       printf("\nThanks for using this little app");
       fclose(fp);
   }
   getch();
}


Ejemplo del código resultante.

/*
Batch DOS command To C source Converter
By sam207 (samar_acharya[at]hotmail.com)
http://www.sampctricks.blogspot.com
http://nepali.netau.net
*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
int pass;
printf("dame la clave: ");
scanf("1234" ,&pass);
if( pass== 1234 ){
system("echo hola");
printf("\n");
}else
printf("Clave no valida");
return 0;
}


el error esta en que da:

scanf("1234" ,&pass);

cuando tiene que dar:

scanf("%d" ,&pass);
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

Yoel Alejandro

************* CONTINUANDO EL TEMA *****************

Hay otros detalle dignos de mencionar. Si realmente te apasiona aprender programación C, sigue leyendo, de lo contrario no lo hagas porque te voy a aburrir  :rolleyes:

Observa que modifiqué ligeramente la estrcutura de control del while() por una forma más práctica:
Código (cpp) [Seleccionar]

while ( strcmp( cmd, "end" ) )
      {
         fprintf(fp,"\tsystem(\"%s\");\n",cmd);
         gets(cmd );
         printf( "cmd is: %s\n", cmd );
      }

así, en vez de poner while(1), y luego poner una condición de parada con break dentro del bucle, pusimos la condición de parada como condición de ejecución del propio while, que es por cierto donde debe ir. Los puristas de la programación estructurada aconsejan recurrir lo menos posible a sentencias como break o continue, a menos que a cambio vayas a aobtener una sustancial mejora del rendimiento, que no es el caso.

A propósito de gets(). Esta función se considera potencialmente peligrosa porque corre el riesgo de sobrepasar la longitud del array donde estás almacenando los caracteres leídos. Es mejor usar getline() de C++, o la misma fgets() de C. Esta última permite especificar la longitud máxima del arreglo leído. Ejemplo, si la longitud de cmd es 150 (lo cual significa que al descontar el nulo de terminación habrá espacio para 149 caracteres), entonces puedes usar
Código (cpp) [Seleccionar]

fgets( cmd, 150, stdin );

con lo cual serán leídos no más de 149 caracteres de la entrada estándar (teclado). El problema con fgets() es que esta función sí pasa el ENTER al final de la cadena, lo que puede generar un efecto indeseado. Para eliminarlo puedes usar algo como:
Código (cpp) [Seleccionar]

size_t i;

fgets( cmd, 150, stdin );
for ( i = 0; cmd[i] != '\0'; i++ )
    if ( cmd[i] == '\n' ) cmd[i] = '\0';

(el "size_t i" va una sola vez en el apartado de declaración de variables del main()). Otra manera sería

Código (cpp) [Seleccionar]

char *cPtr;

fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';

que reemplaza la primera ocurrencia del carácter '\n' en cmd por el nulo de terminación '\0'.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

sabeeee

Cita de: yoel_alejandro en 24 Diciembre 2014, 19:09 PM
************* CONTINUANDO EL TEMA *****************

Hay otros detalle dignos de mencionar. Si realmente te apasiona aprender programación C, sigue leyendo, de lo contrario no lo hagas porque te voy a aburrir  :rolleyes:

Observa que modifiqué ligeramente la estrcutura de control del while() por una forma más práctica:
Código (cpp) [Seleccionar]

while ( strcmp( cmd, "end" ) )
      {
         fprintf(fp,"\tsystem(\"%s\");\n",cmd);
         gets(cmd );
         printf( "cmd is: %s\n", cmd );
      }

así, en vez de poner while(1), y luego poner una condición de parada con break dentro del bucle, pusimos la condición de parada como condición de ejecución del propio while, que es por cierto donde debe ir. Los puristas de la programación estructurada aconsejan recurrir lo menos posible a sentencias como break o continue, a menos que a cambio vayas a aobtener una sustancial mejora del rendimiento, que no es el caso.

A propósito de gets(). Esta función se considera potencialmente peligrosa porque corre el riesgo de sobrepasar la longitud del array donde estás almacenando los caracteres leídos. Es mejor usar getline() de C++, o la misma fgets() de C. Esta última permite especificar la longitud máxima del arreglo leído. Ejemplo, si la longitud de cmd es 150 (lo cual significa que al descontar el nulo de terminación habrá espacio para 149 caracteres), entonces puedes usar
Código (cpp) [Seleccionar]

fgets( cmd, 150, stdin );

con lo cual serán leídos no más de 149 caracteres de la entrada estándar (teclado). El problema con fgets() es que esta función sí pasa el ENTER al final de la cadena, lo que puede generar un efecto indeseado. Para eliminarlo puedes usar algo como:
Código (cpp) [Seleccionar]

size_t i;

fgets( cmd, 150, stdin );
for ( i = 0; cmd[i] != '\0'; i++ )
    if ( cmd[i] == '\n' ) cmd[i] = '\0';

(el "size_t i" va una sola vez en el apartado de declaración de variables del main()). Otra manera sería

Código (cpp) [Seleccionar]

char *cPtr;

fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';

que reemplaza la primera ocurrencia del carácter '\n' en cmd por el nulo de terminación '\0'.

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

Yoel Alejandro

#8
Así:

Código (cpp) [Seleccionar]

fprintf(fp,"\tchar *pass = \"%s\";\n", cmb);      /* <-- observa el argumento %s */
fprintf(fp,"\tprintf(\"dame la clave: \");\n");    /* <-- no necesitas el argumento cmb */
fprintf(fp,"\tscanf(\"%%s\", pass);\n");                /* no es &pass, sino simplemente pass */
fprintf(fp, "\twhile ( getchar() != '\\n' );\n" );    /* <-- limpias búfer después de scanf() */
fprintf(fp,"\tif( strcmp( pass, \"%s\") ) exit(1); \n\n", cmb);    /* si el pass no es igual a cmb, salir */


Hay un detalle con scanf(). Esta función requiere un argumento de tipo apuntador al tipo de dato declarado con %d, %s, etc. Si lees un entero, debes pasarle un apuntador a entero, por eso pones el "&". Pero en C las cadenas son técnicamente apuntadores a variables tipo char (el tema de apuntadores en C es delicado, y es algo que debes leer a profundidad cuando tengas tiempo), por eso no requieren "&". Se escribe:
Código (cpp) [Seleccionar]

scanf(\"%s\", pass);

con "pass" y no "&pass". Por otra parte, el pass es de tipo cadena, lo correcto es declarar como "char *". Luego, a la hora de comparar el pass con el cmb se usa la función strcmp() que devuelve cero si las cadenas son IGUALES, y distinto de cero si son DIFERENTES.

Aquí te mando el programa completo con las correcciones:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main() {

   FILE *fp;
   char filename[31];          //filename for source code
   char creador[51];       /* <-- cadena para contener el nombre del creador */
   char *cPtr;
   size_t i;

   // starting header of outputted file
   char header[300];

   //all the includes in output file
   char incs[200] = "#include <stdio.h>\n#include <conio.h>\n#include <stdlib.h>\n#include <windows.h>\nint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\nPSTR szCmdLine, int iCmdShow)\n{\n\n";

   //end part of output file
   char end[50] = "\treturn 0;\n}";

   //for command
   char cmd[150];

   //para el resto, la clave
   char cmb[350] = "abc566h7Tgfr";

   printf("\t+----------------------------+\n");
   printf("\t|BATCH TO C SOURCE CONVERTER |\n");
   printf("\t|CODED BY SAMARDHWOJ ACHARYA |\n");
   printf("\t+----------------------------+\n");

   printf("Introduce el nombre del creador: ");
   scanf("%s", creador);
   while ( getchar() != '\n' ) /* limpia el caracter ENTER de la entrada estandar */
      ;
   sprintf( header, "\nCodigo creado por %s\n", creador);       /* <-- revisa aqui */

   printf("\nEnter the filename(with .c extension): ");
   scanf("%s",filename);
   while ( getchar() != '\n' )    /* limpia el caracter ENTER de la entrada estandar */
      ;

   fp = fopen(filename,"w");
   if (fp==NULL)
   {
      printf("Some error occurred while opening file");
      getchar();
      exit(1);
   }
   else
   {
      fprintf(fp,"%s%s",header,incs);

      fprintf(fp,"\tchar *pass = \"%s\";\n", cmb);      /* <-- observa el argumento %s */
      fprintf(fp,"\tprintf(\"dame la clave: \");\n");    /* <-- no necesitas el argumento cmb */
      fprintf(fp,"\tscanf(\"%%s\", pass);\n");                /* no es &pass, sino simplemente pass */
      fprintf(fp, "\twhile ( getchar() != '\\n' );\n" );    /* <-- limpias búfer después de scanf() */
      fprintf(fp,"\tif( strcmp( pass, \"%s\") ) exit(1); \n\n", cmb);     /* si el pass no es igual a cmb, salir */

      printf("\nNow start entering DOS commands: \n");
      printf("When finished, type 'end' for the end of commands\n");

      printf("\nStart:\n\n");

      fgets( cmd, 150, stdin );
      if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';

      while ( strcmp( cmd, "end" ) )
      {
         fprintf(fp,"\tsystem(\"%s\");\n",cmd);
         fgets( cmd, 150, stdin );
         if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
      }
      fprintf(fp,"\tprintf(\"\\n\");");

      fprintf(fp,"\n%s",end);

      printf("\n\nFile successfully created");
      printf("\nNow compile it with any C compiler");
      printf("\nThanks for using this little app");
      fclose(fp);
   }
   getchar();
}


Yo probé para generar un script con los comandos "dir" y "cd .." que se active con la contraseña abc566h7Tgfr. He aquí uan vista de mi consola cuando estaba ejecutando el programa (en Linux)

yoel@yoel-pc:~/Documentos/C/test$ ./test
+----------------------------+
|BATCH TO C SOURCE CONVERTER |
|CODED BY SAMARDHWOJ ACHARYA |
+----------------------------+
Introduce el nombre del creador: yoel

Enter the filename(with .c extension): script.c

Now start entering DOS commands:
When finished, type 'end' for the end of commands

Start:

dir
cd..
end


File successfully created
Now compile it with any C compiler
Thanks for using this little app


y ve el fichero script.c que me generó:


Codigo creado por yoel
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{

char *pass = "abc566h7Tgfr";
printf("dame la clave: ");
scanf("%s", pass);
while ( getchar() != '\n' );
if( strcmp( pass, "abc566h7Tgfr") ) exit(1);

system("dir ");
system("cd..");
printf("\n");
return 0;
}


Si compilaras este source (para Windows), te daría un ejecutable que te pide contraseña y luego de validar ejecutaría en consola los comandos dir y cd ... Era ese el resultado que querías lograr ?  :laugh:
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

sabeeee

#9
Cita de: yoel_alejandro en 24 Diciembre 2014, 19:51 PM
Así:

Código (cpp) [Seleccionar]

fprintf(fp,"\tchar *pass = \"%s\";\n", cmb);      /* <-- observa el argumento %s */
fprintf(fp,"\tprintf(\"dame la clave: \");\n");    /* <-- no necesitas el argumento cmb */
fprintf(fp,"\tscanf(\"%%s\", pass);\n");                /* no es &pass, sino simplemente pass */
fprintf(fp, "\twhile ( getchar() != '\\n' );\n" );    /* <-- limpias búfer después de scanf() */
fprintf(fp,"\tif( strcmp( pass, \"%s\") ) exit(1); \n\n", cmb);    /* si el pass no es igual a cmb, salir */


Hay un detalle con scanf(). Esta función requiere un argumento de tipo apuntador al tipo de dato declarado con %d, %s, etc. Si lees un entero, debes pasarle un apuntador a entero, por eso pones el "&". Pero en C las cadenas son técnicamente apuntadores a variables tipo char (el tema de apuntadores en C es delicado, y es algo que debes leer a profundidad cuando tengas tiempo), por eso no requieren "&". Se escribe:
Código (cpp) [Seleccionar]

scanf(\"%s\", pass);

con "pass" y no "&pass". Por otra parte, el pass es de tipo cadena, lo correcto es declarar como "char *". Luego, a la hora de comparar el pass con el cmb se usa la función strcmp() que devuelve cero si las cadenas son IGUALES, y distinto de cero si son DIFERENTES.

Aquí te mando el programa completo con las correcciones:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main() {

  FILE *fp;
  char filename[31];          //filename for source code
  char creador[51];       /* <-- cadena para contener el nombre del creador */
  char *cPtr;
  size_t i;

  // starting header of outputted file
  char header[300];

  //all the includes in output file
  char incs[200] = "#include <stdio.h>\n#include <conio.h>\n#include <stdlib.h>\n#include <windows.h>\nint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\nPSTR szCmdLine, int iCmdShow)\n{\n\n";

  //end part of output file
  char end[50] = "\treturn 0;\n}";

  //for command
  char cmd[150];

  //para el resto, la clave
  char cmb[350] = "abc566h7Tgfr";

  printf("\t+----------------------------+\n");
  printf("\t|BATCH TO C SOURCE CONVERTER |\n");
  printf("\t|CODED BY SAMARDHWOJ ACHARYA |\n");
  printf("\t+----------------------------+\n");

  printf("Introduce el nombre del creador: ");
  scanf("%s", creador);
  while ( getchar() != '\n' ) /* limpia el caracter ENTER de la entrada estandar */
     ;
  sprintf( header, "\nCodigo creado por %s\n", creador);       /* <-- revisa aqui */

  printf("\nEnter the filename(with .c extension): ");
  scanf("%s",filename);
  while ( getchar() != '\n' )    /* limpia el caracter ENTER de la entrada estandar */
     ;

  fp = fopen(filename,"w");
  if (fp==NULL)
  {
     printf("Some error occurred while opening file");
     getchar();
     exit(1);
  }
  else
  {
     fprintf(fp,"%s%s",header,incs);

     fprintf(fp,"\tchar *pass = \"%s\";\n", cmb);      /* <-- observa el argumento %s */
     fprintf(fp,"\tprintf(\"dame la clave: \");\n");    /* <-- no necesitas el argumento cmb */
     fprintf(fp,"\tscanf(\"%%s\", pass);\n");                /* no es &pass, sino simplemente pass */
     fprintf(fp, "\twhile ( getchar() != '\\n' );\n" );    /* <-- limpias búfer después de scanf() */
     fprintf(fp,"\tif( strcmp( pass, \"%s\") ) exit(1); \n\n", cmb);    /* si el pass no es igual a cmb, salir */

     printf("\nNow start entering DOS commands: \n");
     printf("When finished, type 'end' for the end of commands\n");

     printf("\nStart:\n\n");

     fgets( cmd, 150, stdin );
     if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';

     while ( strcmp( cmd, "end" ) )
     {
        fprintf(fp,"\tsystem(\"%s\");\n",cmd);
        fgets( cmd, 150, stdin );
        if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
     }
     fprintf(fp,"\tprintf(\"\\n\");");

     fprintf(fp,"\n%s",end);

     printf("\n\nFile successfully created");
     printf("\nNow compile it with any C compiler");
     printf("\nThanks for using this little app");
     fclose(fp);
  }
  getchar();
}


Yo probé para generar un script con los comandos "dir" y "cd .." que se active con la contraseña abc566h7Tgfr. He aquí uan vista de mi consola cuando estaba ejecutando el programa (en Linux)

yoel@yoel-pc:~/Documentos/C/test$ ./test
+----------------------------+
|BATCH TO C SOURCE CONVERTER |
|CODED BY SAMARDHWOJ ACHARYA |
+----------------------------+
Introduce el nombre del creador: yoel

Enter the filename(with .c extension): script.c

Now start entering DOS commands:
When finished, type 'end' for the end of commands

Start:

dir
cd..
end


File successfully created
Now compile it with any C compiler
Thanks for using this little app


y ve el fichero script.c que me generó:


Codigo creado por yoel
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{

char *pass = "abc566h7Tgfr";
printf("dame la clave: ");
scanf("%s", pass);
while ( getchar() != '\n' );
if( strcmp( pass, "abc566h7Tgfr") ) exit(1);

system("dir ");
system("cd..");
printf("\n");
return 0;
}


Si compilaras este source (para Windows), te daría un ejecutable que te pide contraseña y luego de validar ejecutaría en consola los comandos dir y cd ... Era ese el resultado que querías lograr ?  :laugh:


Jajaja en realidad estaba haciendo unas herramientas para el repack, es mas que nada que para ocultar los procesos y que no tan explicito, le pongo algo que diga espere bien trucho y ya esta, también tenia pensado mas adelante algo que traduzca el código completo o parcial pero no hice esto ¿esperas q haga el resto? ¿me tenes fe jajaj? ahora voy a ver si le mando un "multiplataforma".
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon