2012-09-18 76 views
1

你好我是C新手,我試圖開始這個實驗,其中命令語法是首先列出任何命令行標誌,然後列出一個或多個文件名。閱讀標誌和文件的命令行參數C

我在組織如何掃描輸入參數以及在標誌和文件名之間區分它們時遇到問題。

我想要做一個循環來查看參數是標誌還是文件名。但我不確定如何開始實施它。由於前4個參數可以是任何順序的潛在標誌,所以後面的任何東西都是文件名。但是也可以不給予標誌,只從文件名開始。我根本不知道如何初始化這個循環,以便通過每個論點1。任何人都可以幫忙嗎?可能的命令行參數

例子:

wc fcopy.c head.c (no flags given just file names) 
wc -l -c -w -L fcopy.c head.c a.exe (flags given and multiple files) 
wc -l -w -c -L fcopy.c (flags given and 1 file name) 
+0

linux或windows? – LihO

+0

Mac實際上。把它的一個c程序我跑過終端 –

+0

任何例子?我仍然有點困惑與你的描述:( –

回答

2

讀取命令行參數逐一很簡單:

int main(int argc, // Number of strings in array argv char *argv[]) 

C函數的兩個基本參數是argc(參數的int個數),an d argv(參數的字符串數組)

第一個字符串始終是正在運行的程序的名稱,之後是通過命令行傳遞的參數。

if(argc > 1) 
    for(count = 1 count < argc; count++) 
     printf("%s", argv[count]); 

將在屏幕上顯示每個傳入過去調用程序名稱的參數。 我假設你的標誌是以「 - 」作爲第一個字符傳遞的?如果是這樣,你可以檢查每個字符串中第一個字符的內容是否爲' - '來判斷它是否是一個標誌。

+0

看着它看起來像是非常容易遵循,但for循環如何知道它何時到達參數的末尾? –

+0

argc =參數的數量。因此,我們將for循環迭代器設置爲1(因此它跳過程序名稱)並將其增加到1小於argc。假設你傳入「-n filename.c」,那麼argc將被設置爲3,argv [0] =「yourprgmname.dmg」argv [1] =「 - n」和argv [2] =「文件名。 C」 – Mike

2

退房getopt,它可以讓你解析命令行參數和其國旗:

#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main (int argc, char **argv) 
{ 
    int aflag = 0; 
    int bflag = 0; 
    char *cvalue = NULL; 
    int index; 
    int c; 

    opterr = 0; 

    while ((c = getopt (argc, argv, "abc:")) != -1) 
    switch (c) { 
     case 'a': 
     aflag = 1; 
     break; 
     case 'b': 
     bflag = 1; 
     break; 
     case 'c': 
     cvalue = optarg; 
     break; 
     case '?': 
     if (optopt == 'c') 
      fprintf (stderr, "Option -%c requires an argument.\n", optopt); 
     else if (isprint (optopt)) 
      fprintf (stderr, "Unknown option `-%c'.\n", optopt); 
     else 
      fprintf (stderr, 
        "Unknown option character `\\x%x'.\n", 
        optopt); 
     return 1; 
     default: 
     abort(); 
     } 

    printf ("aflag = %d, bflag = %d, cvalue = %s\n", 
      aflag, bflag, cvalue); 

    for (index = optind; index < argc; index++) 
    printf ("Non-option argument %s\n", argv[index]); 
    return 0; 
} 

Example of Parsing Arguments with getopt

+0

即時通訊我試圖弄清這一點,並在while循環「abc:」究竟是什麼意思?並說他們是4個不同的標誌,我會讓4一個標誌,當參數是一個文件,我需要打開? –

+0

「abc」是你想要'getopt'查找的標誌,':'表示之後會有一個參數,'c',標誌。 'foo.exe -a -b -c hello'。 – 2012-09-18 03:44:25

+0

是否可以使用getopt打開文本文件或者至少認識到它不是一個標誌並執行文件打開方法? –