如何让C程序接受一次选项

时间:2014-03-27 17:34:08

标签: c option

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

int main(int argc, char *argv[])
{
if (argc == 1)
{
    printf("You must supply -m, -f, or -l\n");
    return 1;
}

for (int i = 1; i < argc; i++)
{
    if (strcmp(argv[i], "-l") == 0)
    {
        printf("Salve\n");
    }
    else if (strcmp(argv[i], "-f") == 0)
    {
        printf("Bonjour\n");
    }
    else if (strcmp(argv[i], "-m") == 0)
    {
        printf("Howdy\n");
    }
    else if (strcmp(argv[i], "-d") == 0)
    {
        printf("Derp\n");
    }
    else
    {
        printf("Use -m, -f, or -l\n");
        return 1;
    }
}

return 0;

}

所以当你做./greet -m -m -d时,我想这样做,它可以打印好一次并且一次derp,忽略第二个-m选项。我怎么能做那样的事?

2 个答案:

答案 0 :(得分:3)

不要在命令行中处理标志时立即执行操作,只需设置一个看到它的代码标志(初始化为FALSE)。或者,如果要标记标志的多余用途,请增加计数器。你可以动态处理冲突的标志(-a和-b是互斥的,而在处理-b时,你的a-flag表示你已经给了-a)。处理完命令行后,可以遍历标志并执行操作。国旗的顺序是否重要?

答案 1 :(得分:3)

我想到的最简单的方法是在开头的某处设置int m_set = 0并执行

....
else if (strcmp(argv[i], "-m") == 0 && m_set == 0)
{
    printf("Howdy\n");
    m_set = 1
}
...

在这种情况下,将执行最后的else语句。为了防止这种情况,您可以将其设为else if(m_set == 0)

执行所需操作的另一种方法是使用continue

int m_set = 0
....
else if (strcmp(argv[i], "-m") == 0)
{
    if(m_set == 1)
        continue;
    printf("Howdy\n");
    m_set = 1;
}
...