我想分配给一个int的optarg值,但编译器给我下面的警告:
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
测试中的逗号运算符 。
顺便说一句,GNU的Libc也有argp功能(也getopt_long – 但argp
功能更强大),你可能会发现更方便。 几个框架(特别是Gtk和Qt)也有程序参数传递功能。
如果你正在做一个严肃的程序,请让它接受--help
选项,如果可能的话--version
一个。 这真的很方便,我讨厌一些不接受它们的节目。 看看GNU标准所说的。
optarg
是一个指向字符串的指针 – 如果你想把它转换成一个整数,最简单的方法是使用atoi
:
case 'm': n = atoi(optarg); break;