
Encontrei um pedaço de código C que seria muito útil para o que desejo fazer neste link:Todas as combinações possíveis de caracteres e 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;
}
No entanto, quando tento compilá-lo conforme sugerido, recebo os seguintes erros. Alguém pode me ajudar a corrigi-lo?
$ 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) {'
Além disso, quando tento usar o gcc, recebo um erro de falha de segmentação:
$ mv permute permute.c
$ gcc permute.c -o permute.bin
$ chmod 755 permute.bin
$ ./permute.bin
Segmentation fault (core dumped)
Responder1
Parece que você nomeou inicialmente o arquivo C permute
; quando make
falhou, você tentou executá-lo com seu shell, o que resultou em todos esses erros de sintaxe (já que o shell não sabe como executar o código C).
No segundo caso, você acertou o comentário:
//Deve fornecer comprimento (inteiro < sizeof(buffer)==50) como primeiro argumento;
//Ele irá travar e queimar caso contrário
porque você não forneceu o primeiro (ou nenhum) argumento ao programa. Tentar ./permute.bin 10
.
Responder2
No primeiro caso, parece que você salvou o código C permute
e tentou executar
make CFLAGS=-O3 permute && time ./permute 5 >/dev/null
Como não existe Makefile
um alvo para make
, ele saiu sem erros ao imprimir a mensagem informativa,
Nada a ser feito para 'permutar'.
Como make
não retornou um código de erro, a segunda parte desse comando ( time ./permute 5 >/dev/null
) foi executada. Como permute
é um código-fonte e não um binário executável, ele foi interpretado como um script de shell, resultando na seguinte saída:
./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) {'
Instruções melhores seriam salvar o código-fonte C permute.c
e executar o seguinte comando para compilá-lo (e vincular aos arquivos de biblioteca necessários):
gcc -O3 -o permute permute.c
Isso cria permute
um binário executável que pode ser executado, por exemplo:
./permute 2