将optarg分配给C中的int

Acr*_*ear 4 c unix int casting

我试图将一个optarg值赋给一个int,但编译器给了我以下警告:

warning: assignment makes integer from pointer without a cast [enabled by default]
Run Code Online (Sandbox Code Playgroud)

我已经尝试在分配之前将optarg转换为int

n = (int) optarg;
Run Code Online (Sandbox Code Playgroud)

但仍然收到警告:

warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
Run Code Online (Sandbox Code Playgroud)

在我可以简单地将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;
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 7

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

如果你想要一个整数,你需要使用转换函数,比如atoi(3)

所以你至少应该编码

n = atoi(optarg);
Run Code Online (Sandbox Code Playgroud)

当心,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;
Run Code Online (Sandbox Code Playgroud)

请注意分配给l作为表达和逗号操作符内部if测试.

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

如果你正在做一个严肃的计划,请让它接受--help选项,如果可能的话,接受选项--version.这真的很方便,我讨厌一些不接受它们的节目.了解GNU标准的含义.


Ric*_*dle 5

optarg是一个指向字符串的指针 - 如果你想将其转换为整数,最简单的方法是atoi

case 'm':
    n = atoi(optarg);
    break;
Run Code Online (Sandbox Code Playgroud)