
Encontré un fragmento de código C que sería muy útil para lo que quiero hacer en este enlace:Todas las combinaciones posibles de caracteres y números.
#include <stdio.h>
//global variables and magic numbers are the basis of good programming
const char* charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
char buffer[50];
void permute(int level) {
const char* charset_ptr = charset;
if(level == -1){
puts(buffer);
}else {
while(buffer[level]=*charset_ptr++) {
permute(level - 1);
}
}
}
int main(int argc, char **argv)
{
int length;
sscanf(argv[1], "%d", &length);
//Must provide length (integer < sizeof(buffer)==50) as first arg;
//It will crash and burn otherwise
buffer[length]='\0';
permute(length - 1);
return 0;
}
Sin embargo, cuando intento compilarlo como se sugiere, obtengo los siguientes errores. ¿Alguien puede ayudarme a corregirlo?
$ make CFLAGS=-O3 permute && time ./permute 5 >/dev/null
make: Nothing to be done for 'permute'.
./permute: line 3: //global: No such file or directory
./permute: line 4: const: command not found
./permute: line 5: char: command not found
./permute: line 7: syntax error near unexpected token `('
./permute: line 7: `void permute(int level) {'
Además, cuando intento usar gcc, aparece un error de falla de segmentación:
$ mv permute permute.c
$ gcc permute.c -o permute.bin
$ chmod 755 permute.bin
$ ./permute.bin
Segmentation fault (core dumped)
Respuesta1
Parece que inicialmente nombró el archivo C permute
; cuando make
falló, intentó ejecutarlo con su shell, lo que resultó en todos esos errores de sintaxis (ya que el shell no sabe cómo ejecutar código C).
En el segundo caso, le das al comentario:
//Debe proporcionar longitud (entero < sizeof(buffer)==50) como primer argumento;
//De lo contrario, se bloqueará y arderá
porque no proporcionó un primer (o ningún) argumento al programa. Intentar ./permute.bin 10
.
Respuesta2
En el primer caso, parece que guardó el código C permute
y luego intentó ejecutar
make CFLAGS=-O3 permute && time ./permute 5 >/dev/null
Como no hay Makefile
un objetivo para make
, salió sin error al imprimir el mensaje informativo.
No hay nada que hacer para 'permutar'.
Como make
no devolvió un código de error, time ./permute 5 >/dev/null
se ejecutó la segunda parte de ese comando (). Dado que permute
es código fuente y no un binario ejecutable, se interpretó como un script de shell, lo que generó el siguiente resultado:
./permute: line 3: //global: No such file or directory
./permute: line 4: const: command not found
./permute: line 5: char: command not found
./permute: line 7: syntax error near unexpected token `('
./permute: line 7: `void permute(int level) {'
Mejores instrucciones serían guardar el código fuente C permute.c
y luego ejecutar el siguiente comando para compilarlo (y vincularlo a los archivos de biblioteca requeridos):
gcc -O3 -o permute permute.c
Esto crea permute
un binario ejecutable que se puede ejecutar, por ejemplo:
./permute 2