我试图使它成为getopt可以处理某些标志,但我无法使用getopt实现错误处理。我想防止重复的标记,例如' -s 1 -s 1',并且有太多的参数用于标记' -s 1 2'这两个都应该退出程序。
int opt; //command flags
while((opt = getopt(argc, argv, "s:f:")) != -1){
switch(opt){
case 's':
printf("%s\n", optarg);
printf("%i\n", optind);
break;
case 'f':
printf("%s\n", optarg);
printf("%i\n", optind);
break;
default:
//unknown command flags
fprintf(stderr, "Usage: fred [ -s symbol-table-file ] [ -f fred-program-file ]\n");
return EXIT_FAILURE;
}
}
参数太多(例如,程序-s f1 -f f2 hello)。重复标志(例如,程序-s f1 -s f2)。两者都应退出该计划
答案 0 :(得分:0)
对于每个选项,您可以保留一个标志以查看是否已经遇到该选项。借助这些标志检测到重复的选项。
int c, sflag=0, fflag=0;
while( (c=getopt(argc, argv, "s:f:"))!=-1 )
{
switch(c)
{
case 's':
if(sflag!=0)
{
//fprintf(stderr, "\n dup s option");
return 1; //duplicate s option
}
sflag++;
//printf("\ns flag: %s", optarg);
break;
case 'f':
if(fflag!=0)
{
//fprintf(stderr, "\n dup f option");
return 1; //duplicate f option
}
fflag++;
//printf("\nf flag: %s", optarg);
break;
case '?':
if(isprint(optopt))
{
fprintf(stderr, "Unknown option %c", optopt);
}
else
{
fprintf(stderr, "\nUnknown option character x%x", optopt);
}
return 1;
}
}
optind
将包含下一个argv[]
的索引,但仍有待检查。在完成所有选项之后,在您的程序中应该只有一个非选项参数。
因此,optind
必须等于argc-1
才能正确使用该命令。
if(optind != argc-1) //exactly one non-option argument is expected
{
fprintf(stderr, "\nInvalid number of arguments.");
return 1;
}