2012-04-11 8 views
1

私のC(ちょうどC)プログラムでユーザー入力コマンドを解析したい。サンプルコマンド:Cでシェルのようなコマンドを解析する

add node ID 

add arc ID from ID to ID 

print 

exit 

などです。次に、IDでいくつかの検証を行い、指定された関数にそれらを転送したいと思います。関数と検証はもちろん準備ができています。それはすべての構文解析と機能の一致についてです...

私は多くのifstrtokとそれを作ったが、私はそれが最善の方法ではないと確信しています...任意のアイデア(libs)?

+0

プログラムはコマンドラインパラメータを使用していますか、それともキーボードまたはファイルを読み込んでいますか? IDは何ですか? – gbulmer

+0

私は通常、ループとif文を使って処理しましたが、シェルコマンドを処理するためのライブラリがあるかどうか疑問です。もしあなたが望むなら、おそらくあなたはtypeコマンドを特定し、switch文を使用する最初の文字を持つことができます(-Pはprint、-Rはタイプの追加コマンド、-Eはexitなどです) –

+0

これはコマンドに関するものではありませんプログラムの実行中にキーボードからユーザーコマンドを読み込むことができます。 Pythonでは "shlex"のようなものがあります。 – DavidMG

答えて

2

私が何をしたいことは、このようなものだと思う:あなたは、あなたがそれをすべて解放する直前に「コマンド」と「引数」で望むものを行うことができます

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); 
} 

+0

「完璧な世界」ではないかもしれないが、それは多かれ少なかれ私が必要とするものである。 – DavidMG

0

すべてのコマンドラインパラメータは、char配列* argvに格納されます。これらの値には、argv [0]、argv [1] ... argv [n]を使用してアクセスできます。

+1

私は彼が非コマンドラインコマンドについて話していると思います。つまり、おそらく、彼はおそらくファイルを編集するコマンドを入力するようにユーザーに指示しています。実行中のプログラムからデータをいくつか出力します。 –

+0

@YoussefGとまったく同じです。前記。それは生きている。 – DavidMG

+0

それでも、私は下位投票にふさわしいとは思わない - あいまいな質問です。 – Morpfh

1

コマンド言語の複雑さによって異なります。 2つ以上のコマンドがある場合、または各コマンドがaddコマンドのように複数の形式を取ることができる場合は、単純なrecursive descent parserを覚えておきましょう。

私は過去いくつかのプロジェクトでいくつかのRDPを手動で行ってきました。これはちょっとした作業ですが、かなり複雑なコマンドを扱うことができますが、そうでなければ解析するのは簡単ではありません。 lex/yaccやflex/bisonのようなパーサージェネレータを使用することもできますが、これはあなたがやっていることに対して過度のことかもしれません。

それ以外の場合は、基本的にはこれまで説明したとおりです。 strokとネストされたifステートメントの束。

1

私はちょうどRichard Rossの返事に何かを追加したかっただけです:mallocとreallocから返された値を確認してください。あなたのプログラムでは見つけにくいクラッシュにつながる可能性があります。

関連する問題