
Я нашел фрагмент кода на языке C, который будет очень полезен для того, что я хочу сделать, по этой ссылке:Все возможные комбинации символов и цифр
#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;
}
Однако, когда я пытаюсь скомпилировать его, как предлагается, я получаю следующие ошибки. Может ли кто-нибудь помочь мне исправить это?
$ 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) {'
Также при попытке использовать gcc я получаю ошибку Segmentation fault:
$ mv permute permute.c
$ gcc permute.c -o permute.bin
$ chmod 755 permute.bin
$ ./permute.bin
Segmentation fault (core dumped)
решение1
Похоже, что изначально вы назвали файл C permute
; когда он make
не удался, вы попытались выполнить его с помощью оболочки, что привело ко всем этим синтаксическим ошибкам (поскольку оболочка не знает, как выполнить код C).
Во втором случае вы нажимаете на комментарий:
//Необходимо указать длину (integer < sizeof(buffer)==50) в качестве первого аргумента;
//В противном случае он рухнет и сгорит
потому что вы не предоставили первый (или какой-либо) аргумент программе. Попробуйте ./permute.bin 10
.
решение2
В первом случае, похоже, вы сохранили код C как, permute
а затем попытались запустить
make CFLAGS=-O3 permute && time ./permute 5 >/dev/null
Поскольку нет Makefile
цели для make
, он завершился без ошибок, печатая информационное сообщение,
Ничего не поделаешь для «перестановки».
Поскольку не вернул код ошибки, была запущена make
вторая часть этой команды ( ). Поскольку это исходный код, а не исполняемый двоичный файл, он был интерпретирован как скрипт оболочки, что привело к следующему выводу:time ./permute 5 >/dev/null
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) {'
Лучшими инструкциями были бы сохранение исходного кода C в , permute.c
а затем выполнение следующей команды для его компиляции (и ссылки на необходимые файлы библиотеки):
gcc -O3 -o permute permute.c
Это создает permute
исполняемый двоичный файл, который можно запустить, например:
./permute 2