0

试图使以下 c 代码工作,但每次我给它一个文件来返回它的大小时,它都说文件名是空的。

我尝试过的示例命令行:

Question7 -h -t -f question8.c

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

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

1 回答 1

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;
}
于 2013-10-15T02:44:23.393 回答