2013-10-15 178 views
0

試圖使下面的c代碼工作,但每次我給它一個文件來返回它的大小說文件名是空的。我已經試過optarg總是返回空

例如命令行:

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

回答

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; 
} 
+0

,使一個很大的意義,但現在我得到一個coupel多個錯誤代碼: GCC:無法識別的選項「-h」 CC1:錯誤:無法識別的命令行選項「-f」 CC1:錯誤:無法識別的命令行選項「-f」 –

+0

聽起來好像你試圖用選項'-f'和'-h'運行編譯器,而不是你的程序。 –

+0

就是這樣,謝謝。 –