
このリンクの下に、私がやりたいことに非常に役立つ 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
シェルで実行しようとした結果、これらすべての構文エラーが発生しました (シェルは C コードの実行方法を知らないため)。
2 番目のケースでは、次のコメントにヒットします。
//最初の引数として長さ(整数 < sizeof(buffer)==50)を指定する必要があります。
//そうしないとクラッシュしてしまいます
プログラムに最初の引数 (または引数を 1 つも) を指定していないためです。 を試してください./permute.bin 10
。
答え2
最初のケースでは、Cコードを次のように保存してpermute
実行しようとしたようです。
make CFLAGS=-O3 permute && time ./permute 5 >/dev/null
Makefile
のターゲットを持つがないためmake
、情報メッセージを出力しながらエラーなしで終了しました。
「permute」については何も行う必要はありません。
make
はエラー コードを返さなかったため、そのコマンドの 2 番目の部分 ( 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) {'
permute.c
より良い手順としては、C ソース コードを に保存し、次のコマンドを実行してコンパイル (および必要なライブラリ ファイルにリンク) することです。
gcc -O3 -o permute permute.c
これpermute
により、実行可能な実行可能バイナリが作成されます。例:
./permute 2