2012-09-18 35 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打开文本文件或者至少认识到它不是一个标志并执行文件打开方法? –