C(Cのみ)プログラムでユーザー入力コマンドを解析したい。サンプルコマンド:
add node ID
add arc ID from ID to ID
print
exit
等々。次に、IDを使用して検証を行い、それらを指定された関数に転送します。関数と検証はもちろん準備ができています。関数の解析と照合がすべてです...
私は多くif
のsとstrtok
sでそれを作りました、しかしそれは最善の方法ではないと確信しています...何かアイデア(libs)?
私はあなたが欲しいものはこのようなものだと思います:
while (1)
{
char *line = malloc(128); // we need to be able to increase the pointer
char *origLine = line;
fgets(line, 128, stdin);
char command[20];
sscanf(line, "%20s ", command);
line = strchr(line, ' ');
printf("The Command is: %s\n", command);
unsigned argumentsCount = 0;
char **arguments = malloc(sizeof(char *));
while (1)
{
char arg[20];
if (line && (sscanf(++line, "%20s", arg) == 1))
{
arguments[argumentsCount] = malloc(sizeof(char) * 20);
strncpy(arguments[argumentsCount], arg, 20);
argumentsCount++;
arguments = realloc(arguments, sizeof(char *) * argumentsCount + 1);
line = strchr(line, ' ');
}
else {
break;
}
}
for (int i = 0; i < argumentsCount; i++) {
printf("Argument %i is: %s\n", i, arguments[i]);
}
for (int i = 0; i < argumentsCount; i++) {
free(arguments[i]);
}
free(arguments);
free(origLine);
}
すべてを解放する直前に、「コマンド」と「引数」を使用して、やりたいことができます。
Richard Ross の返信に何か追加したかっただけです: malloc と realloc から返された値を確認してください。プログラムで見つけにくいクラッシュが発生する可能性があります。
コマンド言語がどれほど複雑かによって異なります。2 つ以上のコマンドがある場合、またはコマンドのように各コマンドが複数の形式を取ることができる場合は、単純な再帰降下パーサーを作成する手間をかける価値があるかもしれません。 add
過去にいくつかのプロジェクトでいくつかの RDP を手作業で行ってきました。少し手間がかかりますが、それ以外の方法では簡単に解析できないかなり複雑なコマンドを処理できます。lex/yacc や flex/bison などのパーサー ジェネレーターを使用することもできますが、これはやり過ぎかもしれません。
それ以外の場合は、基本的にあなたが説明したとおりです。ネストされたステートメント strok
の束。if
すべてのコマンドラインパラメータは、と呼ばれる文字列の配列に格納されますargv
。
argv[0]
これらの値には、、argv[1]
...を使用してアクセスできますargv[n]
。