编译C代码时出错

编译C代码时出错

我找到了一段 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

相关内容