我试图将 optarg 值分配给 int,但编译器给了我以下警告:
warning: assignment makes integer from pointer without a cast [enabled by default]
我曾尝试在分配之前将 optarg 转换为 int
n = (int) optarg;
但仍然收到警告:
warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
我不确定在我可以简单地将 optarg 分配给一个整数之前需要做什么,然后打印它(现在)。
int main (int argc, char *argv[])
{
char c;
int n;
while ((c = getopt(argc, argv, "m:")) != -1) {
switch (c) {
case 'm':
n = optarg;
break;
}
}
printf("%d\n", n);
return 0;
}
最佳答案
选项字符串始终是一个字符串。
如果你想要一个整数,你需要使用一个转换函数,比如 atoi(3)
所以你至少应该编码
n = atoi(optarg);
请注意,
optarg
可能是 NULL
,当然也可能是非数字。您可以使用 strtol(3) ,它可以设置您要检查的结束字符。所以更严肃的方法可能是
case 'm':
{
char* endp = NULL;
long l = -1;
if (!optarg || ((l=strtol(optarg, 0, &endp)),(endp && *endp)))
{ fprintf(stderr, "invalid m option %s - expecting a number\n",
optarg?optarg:"");
exit(EXIT_FAILURE);
};
// you could add more checks on l here...
n = (int) l;
break;
}
n = optarg;
break;
注意
l
作为表达式的赋值和 if
测试中的 comma operator。顺便说一句,GNU Libc 也有 argp 函数(还有 getopt_long - 但
argp
函数更强大),你可能会发现它更方便。一些框架(特别是 Gtk 和 Qt)也具有程序参数传递功能。如果你正在做一个严肃的程序,请让它接受
--help
选项,如果可能的话,接受 --version
选项。这真的很方便,我讨厌少数不接受它们的程序。看看 GNU standards 怎么说。关于c - 将 optarg 分配给 C 中的 int,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16573329/