将optarg分配给C中的一个int

我想分配给一个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;