4

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

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;
}
4

2 回答 2

7

选项字符串始终是字符串。

如果你想要一个整数,你需要使用一个转换函数,比如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;

请注意测试中对las 表达式和逗号运算符的赋值if

顺便说一句,GNU Libc 也有argp函数(还有getopt_long - 但argp函数更强大),您可能会发现它更方便。一些框架(特别是 Gtk 和 Qt)也具有程序参数传递功能。

如果你正在做一个严肃的计划,请让它接受这个--help选项,如果可能的话--version。真的很方便,我讨厌少数不接受它们的程序。看看GNU 标准是怎么说的。

于 2013-05-15T19:24:13.137 回答
4

optarg是指向字符串的指针 - 如果要将其转换为整数,最简单的方法是使用atoi

case 'm':
    n = atoi(optarg);
    break;
于 2013-05-15T19:24:31.593 回答