#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选项。我怎么能做那样的事?
答案 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;
}
...