在C中正确解析命令行参数

时间:2011-12-04 10:55:32

标签: c command-line-arguments

我要做的是接受命令行参数并根据参数更改一些变量。我附加了一大块代码,因为整个代码大约是400行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {

    char somestring[500];
    int ca=0;
    if (argc==1) //if no arguments are specified use defaults
    {
    }
    else
    {
        while(ca<argc)
        {
               ca++
            if(strcmp(argv[ca],"-f")==0)
            {
                printf("This works");
                ca++; 
                if(strcmp(argv[ca],"red")==0){
                    printf("this will print red\n");
                }
                else{
                    printf("invalid color");
                }
            }
            if(strcmp(argv[ca),"")==0)
            {
                printf("invalid argument");
            }
            else {
                strcat(somestring,argv[ca]);
            }
        }
        printf("%s",somestring);
    }
}

如果用户输入:

  

./ foobar -f red这是一个字符串

程序应打印:

  

&#34;这将打印红色,这是一个字符串&#34;

如果用户输入:

  

./ foobar -f red

程序应该打印&#34;无效的命令行参数数量&#34;。

最简单的方法是什么?我已经尝试了很多可能性而没有运气。 不同参数的数量对我来说是主要的问题(我也有超过5个选项,例如..- f -b -h -w -e)

帮助非常感谢。如果你愿意,我可以添加我的整个代码。

5 个答案:

答案 0 :(得分:5)

通过此链接,您将找到有关如何轻松执行完整支持命令行参数的说明:

http://www.gnu.org/s/hello/manual/libc/Getopt.html

答案 1 :(得分:1)

char somestring[500]="";//need initialize

    while(++ca<argc){//increment before condition test
        if(strcmp(argv[ca],"-f")==0){

            if(ca < argc && strcmp(argv[ca],"red")==0){//need ca check

        if(ca == argc){//bad strcmp(argv[ca],"")
            printf("invalid argument");

答案 2 :(得分:1)

正确的方法是使用众多现有解析器库中的一个而不是手动解析自己。它更容易,更强大,并为您省去重新发明轮子的麻烦。

GNU libc手册建议了一些库,具体取决于你想要的花式/标准: http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html

  • getopt:正如另一个回答所述
  • argp:我通常的选择
  • suboptions:适用于复杂的解决方案

答案 3 :(得分:0)

将int ca = 0更改为int ca = 1

因为argv [0]是可执行文件的名称

答案 4 :(得分:0)

如果使用for-loop而不是愚蠢的“else while”构造,事情会变得更加清晰:

  for(ca=1; ca < argc ; ca++)
  {
      if(!strcmp(argv[ca],"-f"))
      {
         printf("This works");
         ca++; /* need to test if ca can be incremented */
         if(!strcmp(argv[ca],"red")){
             printf("this will print red\n");
         }
         else{
             printf("invalid color");
         }
      }
      else if(!strcmp(argv[ca],""))
      {
         printf("invalid argument");
      }
      else{
          strcat(somestring,argv[ca]);
      }
  }
  printf("%s",somestring);