我试图将 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;
}

最佳答案

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

如果你想要一个整数,你需要使用一个转换函数,比如 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 测试中的 comma operator

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

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

关于c - 将 optarg 分配给 C 中的 int,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16573329/

10-13 09:36