【发布时间】:2019-04-08 18:35:35
【问题描述】:
我尝试使用getopt,但我遇到了问题。
运行./a.out -A -R 后,我看到了
memory protection violation。
我做错了什么?
int c;
int rec_flag=0;
int copy_range=0;
while((c=getopt(argc,argv,"AR:"))!=-1){
switch(c){
case 'A':
copy_range=1;
break;
case 'R':
rec_flag=1;
break;
case '?':
if (optopt == 'c')
fprintf (stderr, "Option -%c requires an argument.\n", optopt);
else if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,"Unknown option character `\\x%x'.\n",optopt);
return 1;
default:
abort ();
}
}
【问题讨论】:
-
这不是minimal reproducible example。您是否尝试过通过调试器运行代码?
-
我的程序需要 2 个参数(目录路径)和 -A 等可选选项。我尝试“./a.out /home /bin -A”,但这不起作用
-
问题在于
getopt格式字符串:c=getopt(argc,argv,"AR:"):表示R选项需要一个参数。你没有提供任何东西。这不应该崩溃,因为传递的参数数量是正确的。 -
当
-R name选项被识别时,您将丢弃optarg中的值。从字符串"AR:"中删除R之后的冒号,或者将optarg的值存储在某处以保存提供的名称。您确定崩溃是在getopt()中而不是在一些后续代码中吗?getopt()的标准版本不应仅仅因为命令被错误地调用而没有与冒号匹配的参数而崩溃。 -
我猜这是处理参数的任何函数,您将参数传递给函数是错误的。通常
getopt代码直接在main中处理,系统不会错误传入参数。但是,如果您指定的argc比argv实际包含的更大,您可能会遇到运行时错误。