optarg总是返回null

时间:2013-10-15 02:40:10

标签: c null command-line-arguments

尝试使以下c代码工作,但每次我给它一个文件返回它的大小说文件名为null。

我尝试过的示例命令行:

Question7 -h -t -f question8.c

无论如何,它返回optarg为null。我不确定为什么会这样。

#include <stdio.h>
#include <getopt.h>
#include <sys/utsname.h>
#include <time.h>
#include <sys/stat.h>

int main(int argc, char **argv){
  char c;
  struct utsname uname_pointer;
  time_t time_raw_format;
  struct stat s;

  int hflag = 0;
  int tflag = 0;
  int fflag = 0;
  char *fvalue = NULL;
  int index;
  int check;

  opterr = 0;

  while ((check = getopt (argc, argv, "htf:")) != -1){
      switch (check) {
         case 'h':
            hflag = 1;
            break;
         case 't':
            tflag = 1;
            break;
         case 'f':
            fflag = 1;

            break;
       } 
  }
  if (hflag ==1 ) {
      uname (&uname_pointer);
      printf("Hostname = %s \n", uname_pointer.nodename);
  }

  if (tflag ==1 ){
     time (&time_raw_format);
     printf("the current local time: %s", ctime(&time_raw_format));
  }

  if (fflag == 1){
      if (stat(optarg, &s) == 0){
             printf("size of file '%s' is %d bytes\n", optarg, (int) s.st_size);
      }else {
             printf("file '%s' not found\n", optarg);
      }
  }
}

1 个答案:

答案 0 :(得分:1)

当您获得-f(或'f')时,就会看到optarg

char *fname = 0;

     case 'f':
        fname = optarg;
        break;

等。 optarg每次都会重新归零,所以当getopt()失败并退出循环时,它再次为NULL。通常,您可以使用许多选项来获取选项值,而单个全局变量不能同时存储它们。

#include <stdio.h>
#include <getopt.h>
#include <sys/utsname.h>
#include <time.h>
#include <sys/stat.h>

int main(int argc, char * *argv)
{
    char *fname = NULL;
    int   check;
    int   hflag = 0;
    int   tflag = 0;

    opterr = 0;

    while ((check = getopt(argc, argv, "htf:")) != -1)
    {
        switch (check)
        {
        case 'h':
            hflag = 1;
            break;
        case 't':
            tflag = 1;
            break;
        case 'f':
            fname = optarg;
            break;
        }
    }

    if (hflag == 1)
    {
        struct utsname uname_pointer;
        uname(&uname_pointer);
        printf("Hostname = %s \n", uname_pointer.nodename);
    }

    if (tflag == 1)
    {
        time_t time_raw_format;
        time(&time_raw_format);
        printf("the current local time: %s", ctime(&time_raw_format));
    }

    if (fname != NULL)
    {
        struct stat s;
        if (stat(fname, &s) == 0)
            printf("size of file '%s' is %d bytes\n", fname, (int) s.st_size);
        else
            printf("file '%s' not found\n", fname);
    }
    return 0;
}