2010-11-18 16 views
0

私がしなければならないことは、様々なタイプの引数をとり、それを配列パラメータに置くターミナルメニューを作ることです。 Underはコードです:ここでは、私が持っているいくつかの問題と良い解決策を見つけることはできません。チャレンジ付きターミナルメニューの作成

「list」と入力するだけで有効なコマンドではなく、「list」(リストとスペース)と入力する必要があります。 新しいメニュー選択は次のようにする必要があります:新しい "私の名前はこんにちは"。 param [0] = newとparam [1] =私の名前はこんにちは、(sowはスペースでメッセージを作ることができます)。

どうすればこの問題を解決できますか?これはあなたの問題を引き起こすが、これらの線が

 /*new(param[1]); 

     /*list(); 

終了されることはありませんコメントを起動した場合

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <limits.h> 

int menu() 
{ 
    printf(">"); 

    char line[LINE_MAX]; 
    int i = 0; 
    char *param[4]; 

    while(fgets(line, LINE_MAX, stdin) != NULL) { 
     param[i++] = strtok(line, " \n"); 

     if(param[0] != NULL) { 
      char *argument; 

      while((argument = strtok(NULL, "\n")) != NULL) { 
       param[i++] = argument; 
      } 
     } 

     if(strcmp(param[0], "new") == 0) { 
      //new(param[1]); 
      menu(); 

     } else if(strcmp(param[0], "list") == 0) { 
      //list(); 
      menu(); 

     } else { 
      printf("Not a valid command.\n\n"); 
      menu(); 
     } 
    } 

    return 0; 
} 

答えて

0

は私はわかりません。

あなたは1行は、あなたが使用することができますコメントしたい場合:

 // comment 

(少なくともCで++およびC99から上)

しかし/*で始まるコメントが入れ子に*/ないで終了する必要があります。

/* comment */ 

/* also multi line 
    allowed */ 

コンパイラが警告を出したコメントでコメントを開始するので、実際にはこれをまったくコンパイルしないでください。

+0

今、それは編集されました...何とか問題の原因に関連している場合はどうなるのですか? –

+0

こんにちは..まあ、私のせいです、今です。これらの関数をコメントアウトして、コードをコンパイルすることができます。 – user265767

+0

編集をお詫び申し上げます。上記のプログラムには多くの問題(プログラムロジックを含む)があり、そのコメントを変更する必要があります。しかし、質問との関係はありません。質問は、コメントのある行の前に何かをすることについて尋ねました。 – pmg

1

""を区切ります。

fgetsは、ENTERを読み取ります。

したがって、 "listENTER"とtokeniseをスペースで入力すると、1つのトークン、つまり "listENTER"が得られます。後であなたは "リスト"と比較して、もちろん、それは一致しません。

strtok(line, " \n"); /* maybe include tabs too? */ 

PSを試してみてください。あなたはなぜ再帰的にmenuと呼んでいますか?関数内に既にwhileがあります。

+0

ありがとう。これは問題の1つを解決します! param []に「彼女にスペースがあっても」の間にすべてを入れるメニューはどうやって入手できますか? – user265767

+0

新しい質問をするかもしれません...あなたは 'param'を確認する必要があります。それは4つのポインタのためのスペースを持っています。あなたの文字列は4つ以上のトークンを持っています。 – pmg

+0

あなたは誤解しています。次のコマンドを入力します:new "my name is"、param [0] = new、param [1] = my name is。 – user265767

1

問題はparam [i ++] = strtok(line、 "");です。スペース上でのみ分割され、\ n(改行)では分割されません。これを区切り文字の配列に追加してみてください。

ありがとうございました。きれいで整形式のコードです。おめでとうございます。楽しい変化。

0

「リスト」を入力する必要がある理由は、最初のstrtokがスペース文字にトークン化されるため、この場合は1文字を入力する必要があります。区切り文字として'\n'とスペースの両方を使用できます。つまり、strtokという2番目のパラメータを" \n"に置き換えてください。

引用符については、引用符で始まるものから始まるものまでのパラメータを、それらの間の文字をスペースで置き換えることで、1つで終わるものに再結合する必要があります。または、strtokで取り除き、手動でlineの文字を繰り返して解析する。

関連する問題