2013-10-08 92 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返回一个字符*不是字符 –

回答

2

strtok()返回指针,所以你必须声明parampartparamvalue为指针,就像

char *parampart; 
char *paramvalue; 

你的代码的其余部分是正确的。

+0

哈,我什至都没有看到。是的,这也是一个问题(除非你在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); 
} 

我建议你为每个选项设置的标志,并根据用来初始化它们表现你的节目。