2013-04-29 5 views
0

Я использую poptGetArgs для чтения нескольких значений для одной опции. Но он всегда возвращает null как возвращаемое значение. Я разместил свой код ниже. пожалуйста, помогите мне решить, есть ли у него какие-либо ошибки.poptGetArgs возврат null.

int main(int argc, char **argv) 
{ 
    char filename[ 128 ], symbol[32]; 
    memset(filename, 0x0, 128); 
    memset(symbol, 0x0, 32); 

    struct poptOption opttable[] = 
    { 
     { "file", 'f', POPT_ARG_STRING, filename, INPUT_NAME, "filenames to read", "list of files we need to read" }, 
     { "symbol", 'r', POPT_ARG_STRING, symbol, SYMBOL, "symbol to view", NULL }, 
     { NULL, 0, 0, NULL, 0 } 
    }; 
    poptContext options_socket = poptGetContext(NULL, argc, (const char **)argv, opttable, 0); 

    int optionvalue(0); 
    while(optionvalue > -1) 
    { 
     optionvalue = poptGetNextOpt(options_socket); 
     if(optionvalue == INPUT_NAME) 
     { 
      const char ** files = poptGetArgs(options_socket); 
      if(files == NULL) 
      { 
       printf("There was an error while reading input files\n"); 
      } 
     } 
     else if(optionvalue == SYMBOL) 
     { 
      strcpy(symbol, poptGetOptArg(options_socket)); 
      printf("symbol you are giving as input is :%s, option value:%d\n", symbol, optionvalue); 
     } 
    } 
    return 0; 
} 
+0

В стороне: вместо 'memset (filename, 0x0, 128);' почему не просто сказать 'char filename [128] = ""; '? –

+0

Оба - то же самое. – VNS

ответ

0

Это потому, что я пытаюсь прочитать остаточные аргументы в середине (после чтения файла). Но все оставшиеся варианты следует читать только в конце. Мне нужно прочитать аргументы после цикла while (optionvalue> -1). Моим измененным кодом является

enum 
{ 
    INPUT_NAME=1, 
    SYMBOL 
}; 
int main(int argc, char **argv) 
{ 
    char filename[ 128 ], symbol[32]; 
    memset(filename, 0x0, 128); 
    memset(symbol, 0x0, 32); 

    struct poptOption opttable[] = 
    { 
     { "file", 'f', POPT_ARG_STRING, filename, INPUT_NAME, "filenames to read", "list of files we need to read" }, 
     { "symbol", 'r', POPT_ARG_STRING, symbol, SYMBOL, "symbol to view", NULL }, 
     { NULL, 0, 0, NULL, 0 } 
    }; 
    poptContext options_socket = poptGetContext(NULL, argc, (const char **)argv, opttable, 0); 

    int optionvalue(0); 
    while(optionvalue > -1) 
    { 
     optionvalue = poptGetNextOpt(options_socket); 
     if(optionvalue == INPUT_NAME) 
     { 
      strcpy(filename, poptGetOptArg(options_socket)); 
      printf("file name you are giving as input is :%s, option value:%d\n", filename, optionvalue); 
//   const char ** files = poptGetArgs(options_socket); 
     } 
     else if(optionvalue == SYMBOL) 
     { 
      strcpy(symbol, poptGetOptArg(options_socket)); 
      printf("symbol you are giving as input is :%s, option value:%d\n", symbol, optionvalue); 
     } 
    } 
    const char ** files = poptGetArgs(options_socket); 
    if(files == NULL) 
    { 
     printf("There are no other files left\n"); 
    } 
    return 0; 
} 

Сейчас он отлично работает.

 Смежные вопросы

  • Нет связанных вопросов^_^