在C中将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

我试图将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分配给一个整数,然后打印它(现在)之前需要做什么

选项字符串始终是字符串

如果需要整数,则需要使用转换函数,如

因此,您至少应该编写代码

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也有一些函数(而且-but
argp
函数更强大),您可能会发现这些函数更方便。一些框架(特别是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;