Así:
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:
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:
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)
y ve el fichero script.c que me generó:
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 ?
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)
Código [Seleccionar]
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ó:
Código [Seleccionar]
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 ?
