在C中将optarg赋值给int
我试图将optarg值分配给int,但编译器向我发出以下警告:在C中将optarg赋值给int,c,unix,casting,int,C,Unix,Casting,Int,我试图将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-c
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分配给一个整数,然后打印它(现在)之前需要做什么
选项字符串始终是字符串
如果需要整数,则需要使用转换函数,如
因此,您至少应该编写代码
n = atoi(optarg);
注意,optarg
可能是NULL
,当然也可能是非数字。您可以使用which设置要检查的结束字符
因此,可以采取更严肃的方法
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
测试内部的赋值
顺便说一句,GNULIBC也有一些函数(而且-butargp
函数更强大),您可能会发现这些函数更方便。一些框架(特别是Gtk和Qt)也具有程序参数传递功能
如果您正在执行一个严肃的程序,请让它接受
--help
选项,如果可能,请接受--version
选项。它真的很方便,我讨厌少数不接受它们的程序。请参见说明。optarg
是指向字符串的指针-如果要将其转换为整数,最简单的方法是使用atoi
:
case 'm':
n = atoi(optarg);
break;
这是64位Linux吗?如果是,请将int更改为long@Mellowcandle:不一定。也许作者知道
n
是一个小整数……提示对初学者特别有用:使用gcc-Wall-g
编译并改进程序,直到没有警告为止。然后学习如何使用gdb
调试器。
case 'm':
n = atoi(optarg);
break;