2013-10-08 3 views
0

Я новичок в C и я пытаюсь передать аргументы моей программе какДробление и обращающиеся строки в C

program_name -param1=something -param2=somethingelse 

Тогда в моей программе я хочу проходным аргументы и разделить их на «= "и распечатать две части обратно в командной строке. Вот то, что я до сих пор

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

int main(int argc, char *argv[]) 
{ 
    int i = 0; 
    char parampart; 
    char paramvalue; 
    for(i = 0; i < argc; i++) 
    { 
     parampart = strtok(argv[i], "="); 
     paramvalue = strtok(NULL, "="); 
     printf("parampart: %s paramvalue %s", parampart, paramvalue); 
    } 

    return 0; 
} 

Я получаю сообщение об ошибке, потому что переменные parampart и paramvalues ​​являются указателями, но я не уверен, как использовать указатели для получения значений строки.

+0

strtok возвращает символ * не char –

ответ

2

Указатель strtok() возвращается, так что вы должны объявить parampart и paramvalue как указатели, как

char *parampart; 
char *paramvalue; 

остальную часть кода является правильным.

+0

Hah, я даже не видел этого. Да, это тоже проблема (если вы не на 8-битной машине ;-)). – Sneftel

2

Если вы используете Linux, вы можете использовать getopt. это облегчает жизнь

+0

Getopt захочет, чтобы параметры «=» были -, а не -. Но этот незначительный каламбур зависит от того, хочет ли OP быть способным анализировать параметры для использования или если цель упражнения заключается в демонстрации с использованием argc и argv. Для использования, getopt или getopt_long - это, безусловно, путь. – mpez0

+0

Спасибо, хотя я не хочу ограничивать себя только Linux – Pattle

1

Проблема в том, что вы предполагаете, что в каждом аргументе будет =. Большинство из них делают ... но не нулевой, то есть program_name. Вы должны начать с arg 1, а не arg 0, и вы должны проверить нулевой возврат со второго вызова strtok, если пользователь забудет знак равенства.

Конечно, как упоминалось @MOHAMED, это работа для getopt.

+0

Спасибо, много хорошего совета – Pattle

0

Это хороший пример из man strtok, вы должны вызвать один раз befroe вашего цикла:

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

    int 

    main(int argc, char *argv[]) 
    { 
     char *str1, *str2, *token, *subtoken; 
     char *saveptr1, *saveptr2; 
     int j; 

     if (argc != 4) { 
      fprintf(stderr, "Usage: %s string delim subdelim\n", 
        argv[0]); 
      exit(EXIT_FAILURE); 
     } 

     for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) { 
      token = strtok_r(str1, argv[2], &saveptr1); 
      if (token == NULL) 
       break; 
      printf("%d: %s\n", j, token); 

      for (str2 = token; ; str2 = NULL) { 
       subtoken = strtok_r(str2, argv[3], &saveptr2); 
       if (subtoken == NULL) 
        break; 
       printf(" --> %s\n", subtoken); 
      } 
     } 

     exit(EXIT_SUCCESS); 
    } 

И согласно man getopt:

#include <stdio.h>  /* for printf */ 
#include <stdlib.h> /* for exit */ 
#include <getopt.h> 

int 
main(int argc, char **argv) 
{ 
    int c; 
    int digit_optind = 0; 

    while (1) { 
     int this_option_optind = optind ? optind : 1; 
     int option_index = 0; 
     static struct option long_options[] = { 
      {"add",  required_argument, 0, 0 }, 
      {"append", no_argument,  0, 0 }, 
      {"delete", required_argument, 0, 0 }, 
      {"verbose", no_argument,  0, 0 }, 
      {"create", required_argument, 0, 'c'}, 
      {"file", required_argument, 0, 0 }, 
      {0,   0,     0, 0 } 
     }; 

     c = getopt_long(argc, argv, "abc:d:012", 
       long_options, &option_index); 
     if (c == -1) 
      break; 

     switch (c) { 
     case 0: 
      printf("option %s", long_options[option_index].name); 
      if (optarg) 
       printf(" with arg %s", optarg); 
      printf("\n"); 
      break; 

     case '0': 
     case '1': 
     case '2': 
      if (digit_optind != 0 && digit_optind != this_option_optind) 
       printf("digits occur in two different argv-elements.\n"); 
      digit_optind = this_option_optind; 
      printf("option %c\n", c); 
      break; 

     case 'a': 
      printf("option a\n"); 
      break; 

     case 'b': 
      printf("option b\n"); 
      break; 

     case 'c': 
      printf("option c with value '%s'\n", optarg); 
      break; 

     case 'd': 
      printf("option d with value '%s'\n", optarg); 
      break; 

     case '?': 
      break; 

     default: 
      printf("?? getopt returned character code 0%o ??\n", c); 
     } 
    } 

    if (optind < argc) { 
     printf("non-option ARGV-elements: "); 
     while (optind < argc) 
      printf("%s ", argv[optind++]); 
     printf("\n"); 
    } 

    exit(EXIT_SUCCESS); 
} 

Я предлагаю вам установить флаг для каждого варианта и initilize их в соответствии вести свою программу.

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