2017-04-21 2 views
0

以下のCコードは正常に動作しますが、ユーザがオプション-dを渡したかどうかを知るにはどうすればいいですか?私は、ユーザーが-dオプションOPTARG使用している場合にのみ特定のoptargオプションがcで渡されているかどうかを知る方法

Eg : ./application -d 

のみ、このコードが動作することを知ることができるコードの下から

ユーザーが

 ./application -a 

を入力した場合、オプション-dが渡されているかどうか、私はそれを知ることはできません。

また-aが複数の値を取る必要がありますが、コード以下のオプションは、単一の値を

eg : ./application -a knn , lr , ln 

がどのように私はこのコードは同じオプションに複数の値を受け入れることができます動作しますか?コードの下

は、単一の値のために正常に動作します

eg : ./application -a knn 




     int main(int argc, char *argv[]) { 
     int opt= 0; 
     int start = -1, end = -1; 
     char *alg,*dir,*graph; 
     //Specifying the expected options 
     //The two options s and e expect numbers as argument 
     static struct option long_options[] = { 
     {"start",no_argument,0,'s' }, 
     {"end",no_argument,0,'e' }, 
     {"algorithm",no_argument, 0,'a' }, 
     {"directory",required_argument, 0,'d' }, 
     {"graph",required_argument,0,'g' }, 
     {0,0,0,0} 
     }; 

     int long_index =0; 
     int i=0,j=0; 
     size_t size = 1; 
     while ((opt = getopt_long(argc, argv,"s:e:a:d:h:g:", 
       long_options, &long_index)) != -1) { 
      switch (opt) { 
      case 'd' : 
        dir = optarg; 

         if (optarg == NULL) 
         printf("d option is must"); 
         else 
         { 
         printf("option -d value is must\n"); 
         usage(); 
         exit(EXIT_FAILURE); 
         } 
         break; 
      case '?': 
        if (optopt == ('d' || 'a' || 'g' || 's' || 'e')) 
         fprintf (stderr, "Option -%c reqd", optopt); 
         usage(); 
         exit(EXIT_FAILURE); 
      case 'a' : 
         alg = optarg; 
         if(alg == "lr" || alg == "knn" || alg == "cart") 
          { 
         printf("you entered option -a \"%s\"\n",optarg); 
          } 
         else 
          { 
         printf("Wrong option -a value is passed\n"); 
          : 
          : 
          : 

答えて

0

メインのパラメータは()であることを覚えておいてください:

int main(int argc, char *argv[]) 

のでチェックargcは1より大きいこと、いくつかの引数が渡されたことを示しています。

argv[]ので、あなたがこれをそのリストをループ

#include <stdio.h> // fprintf() 
#include <stdlib.h> // exit(), EXIT_FAILURE 

int main(int argc, char *argv[]) 
{ 
    if(1 >= argc) 
    { 
     fprintf(stderr, "USAGE: %s <-d>\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } 

    int found = 0; 
    for(int i = 1; i<=argc; i++) 
    { 
     if(0 == strnlen(argv[i], "-d", 2)) 
     { 
      printf("-d parameter entered\n"); 
      found = 1; 
      break; 
     } 
    } 

    if(0 == found) 
    { 
     fprintf(stderr, "some parameters entered but none are [-d\]n"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, parameter -d entered by user 

    .... 
} // end function: main 
+0

(0 == strnlen(ARGV [i]は、 "-d"、2))であれば説明することができますすることができます文字列をcharへのポインタのリストでありますコード行? – programmer

+0

@programmer 'strlen()'のmanページは非常に良い説明ですが、簡単にするために、 'argv [i]'が指すchar配列の最初の2バイトを文字列 "-d"と比較してください。一致した場合、 'if()'の本文が入力されます – user3629249

関連する問題