我找到了一段 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 时,我收到分段错误错误:
$ mv permute permute.c
$ gcc permute.c -o permute.bin
$ chmod 755 permute.bin
$ ./permute.bin
Segmentation fault (core dumped)
答案1
看起来您最初将 C 文件命名为permute
;当make
失败时,您尝试使用 shell 执行它,这导致了所有这些语法错误(因为 shell 不知道如何执行 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
它是源代码而不是可执行二进制文件,因此它被解释为 shell 脚本,从而产生以下输出:
./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