【问题标题】:Properly parse command line arguments in C正确解析 C 中的命令行参数
【发布时间】:2016-03-25 00:10:02
【问题描述】:

我想要做的是接受命令行参数并根据参数更改一些变量。我附上了我的一大段代码,因为整个代码大约有 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 这是一个字符串

程序应该打印:

"这将打印红色这是一个字符串"

如果用户输入:

./foobar -f 红色

程序应该打印“无效的命令行参数数量”。

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

帮助将不胜感激。如果你愿意,我可以添加我的整个代码。

【问题讨论】:

标签: c command-line-arguments


【解决方案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】:

    正确的方法是使用许多现有的解析器库之一,而不是自己手动解析。它更简单、更强大,并且省去了重新发明轮子的麻烦。

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

    • getopt:正如另一个答案所提到的
    • argp:我的一贯选择
    • suboptions: 用于复杂的解决方案

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 对不起,我没有从我的 c 文件中正确复制代码,现在检查一下。谢谢。
      【解决方案4】:

      如果您使用 for 循环而不是愚蠢的“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);
      

      【讨论】:

        猜你喜欢
        • 2011-05-21
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多