Acr*_*ear 4 c unix int casting
我试图将一个optarg值赋给一个int,但编译器给了我以下警告:
warning: assignment makes integer from pointer without a cast [enabled by default]
Run Code Online (Sandbox Code Playgroud)
我已经尝试在分配之前将optarg转换为int
n = (int) optarg;
Run Code Online (Sandbox Code Playgroud)
但仍然收到警告:
warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
Run Code Online (Sandbox Code Playgroud)
在我可以简单地将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;
}
Run Code Online (Sandbox Code Playgroud)
选项字符串始终是一个字符串.
如果你想要一个整数,你需要使用转换函数,比如atoi(3)
所以你至少应该编码
n = atoi(optarg);
Run Code Online (Sandbox Code Playgroud)
当心,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;
Run Code Online (Sandbox Code Playgroud)
请注意分配给l作为表达和逗号操作符内部if测试.
BTW,GNU Libc也有argp函数(还有getopt_long - 但argp功能更强大),你可能会发现它们更方便.一些框架(特别是Gtk和Qt)也有程序参数传递功能.
如果你正在做一个严肃的计划,请让它接受--help选项,如果可能的话,接受选项--version.这真的很方便,我讨厌一些不接受它们的节目.了解GNU标准的含义.
optarg是一个指向字符串的指针 - 如果你想将其转换为整数,最简单的方法是atoi:
case 'm':
n = atoi(optarg);
break;
Run Code Online (Sandbox Code Playgroud)